0Pricing
Kotlin Academy · 课时

使用 field 自定义 Getter 与 Setter

使用 backing field 关键字编写计算属性和自定义 Setter。

使用 field 自定义 Getter 与 Setter 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

属性不只是字段

每个 Kotlin 属性都有自动生成的 getter(对于 var,还会有 setter)。您可以重写它们来添加验证、日志记录或计算等逻辑。

自定义 Getter

重写 get(),即可在每次读取属性时计算其值。

class Circle(val radius: Double) {
    val area: Double
        get() = Math.PI * radius * radius
}
fun main() {
    val c = Circle(3.0)
    println(c.area) // ~28.27
}

计算属性

计算属性没有后备字段,其值会在每次访问时计算。

class Rectangle(val w: Int, val h: Int) {
    val area get() = w * h
    val perimeter get() = 2 * (w + h)
}
fun main() {
    val r = Rectangle(3, 4)
    println("${r.area}, ${r.perimeter}") // 12, 14
}

使用 field 的自定义 Setter

在自定义 setter 内部,field 指后备字段,也就是实际的存储空间。

class Temperature {
    var celsius: Double = 0.0
        set(value) {
            require(value >= -273.15) { "below absolute zero" }
            field = value
        }
}
fun main() {
    val t = Temperature()
    t.celsius = 25.0
    println(t.celsius)
    // t.celsius = -300.0 // throws
}

自动生成后备字段

如果 getter 或 setter 使用了 field,Kotlin 就会生成后备字段。如果二者都没有使用它,则不会创建字段,此属性完全由计算得出。

class Counter {
    var count: Int = 0
        set(value) {
            println("Setting count from $field to $value")
            field = value
        }
}
fun main() {
    val c = Counter()
    c.count = 5
    c.count = 10
}

带副作用的 Setter

请将日志记录、变更通知或相关状态同步等逻辑放入自定义 setter。

class Brightness {
    var level: Int = 50
        set(value) {
            val clamped = value.coerceIn(0, 100)
            println("Brightness -> $clamped")
            field = clamped
        }
}
fun main() {
    val b = Brightness()
    b.level = 75
    b.level = 150 // clamps to 100
    println(b.level)
}

私有 Setter

将 setter 标记为 private,即可对外提供只读 API,同时允许内部修改。

class Score {
    var value: Int = 0
        private set
    fun increment() { value++ }
    fun reset() { value = 0 }
}
fun main() {
    val s = Score()
    s.increment(); s.increment()
    println(s.value) // 2
    // s.value = 100 // ERROR: setter is private
}

在 Setter 中进行验证

自定义 setter 是进行输入验证的自然位置。

class Email {
    var address: String = ""
        set(value) {
            require(value.contains("@")) { "invalid email" }
            field = value
        }
}
fun main() {
    val e = Email()
    e.address = "ada@example.com"
    println(e.address)
}

带逻辑的 Getter

Getter 可以转换存储的状态,例如格式化存储值或应用默认备用值。

class Profile(_name: String?) {
    var rawName: String? = _name
    val displayName: String
        get() = rawName ?: "(unset)"
}
fun main() {
    val p = Profile(null)
    println(p.displayName) // (unset)
}

比较 val 与 var

val 属性只有 getter(没有 setter);var 属性同时拥有二者。

class Box {
    val readOnly: Int get() = 42
    var readWrite: Int = 0
}
fun main() {
    println(Box().readOnly)
    val b = Box(); b.readWrite = 5; println(b.readWrite)
}

常见错误:递归

不要在属性自己的存取器中使用属性名,否则会导致无限递归。请改用 field。

class Wrong {
    var x: Int = 0
        set(value) {
            // x = value // INFINITE RECURSION — calls setter again
            field = value // CORRECT
        }
}
fun main() {
    val w = Wrong(); w.x = 42; println(w.x)
}

快速检查

在自定义设置器中,标识符 field 指的是什么?

回顾

重写 get() 和 set(),即可为属性访问添加逻辑。在存取器中使用 field 读取或写入后备字段。将设置器标记为 private,即可提供只读的公共 API;如果值始终由其他数据推导得出,请使用计算属性(没有后备字段)。

常见问题解答

「使用 field 自定义 Getter 与 Setter」课时是免费的吗?

是的 — 「使用 field 自定义 Getter 与 Setter」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「使用 field 自定义 Getter 与 Setter」这节课中我会学到什么?

使用 backing field 关键字编写计算属性和自定义 Setter。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 field 自定义 Getter 与 Setter」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 主构造函数与属性参数
  2. init 代码块与初始化顺序
  3. 使用 field 自定义 Getter 与 Setter
  4. lateinit 与延迟初始化
← 返回 Kotlin Academy