使用 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 反馈 — 无需本地设置。
此课程中的所有课时
- 主构造函数与属性参数
- init 代码块与初始化顺序
- 使用 field 自定义 Getter 与 Setter
- lateinit 与延迟初始化