在编程中,getter 用于获取属性的值。同样,setter 用来设置属性的值。
在Kotlin中,getter 和 setter是可选的,如果未在程序中创建它们,它们将自动生成。
getter 和 setter 如何工作?
Kotlin中的以下代码
class Person {
var name: String = "defaultValue"
}
等同于
class Person {
var name: String = "defaultValue"
// getter
get() = field
// setter
set(value) {
field = value
}
}
实例化 Person 类的对象并初始化 name 属性时,它将传递给 setters 参数值并将 field 设置为 value。
val p = Person()
p.name = "jack"
现在,当您访问对象的 name 属性时,由于代码 get()=field,您将获得 field
println("${p.name}")
这是一个工作示例:
fun main(args: Array<String>) {
val p = Person()
p.name = "jack"
println("${p.name}")
}
class Person {
var name: String = "defaultValue"
get() = field
set(value) {
field = value
}
}
运行该程序时,输出为:
jack
默认情况下,这就是 getter 和 setter 的工作方式。但是,您可以使用 getter 和 setter来更改属性的值(修改值)。
示例:更改属性的值
fun main(args: Array<String>) {
val maria = Girl()
maria.actualAge = 15
maria.age = 15
println("玛莉亚: 实际年龄 = ${maria.actualAge}")
println("玛莉亚: 虚拟年龄 = ${maria.age}")
val angela = Girl()
angela.actualAge = 35
angela.age = 35
println("安戈洛: 实际年龄 = ${angela.actualAge}")
println("安戈洛: 虚拟年龄 = ${angela.age}")
}
class Girl {
var age: Int = 0
get() = field
set(value) {
field = if (value < 18)
18
else if (value >= 18 && value <= 30)
value
else
value-3
}
var actualAge: Int = 0
}
运行该程序时,输出为:
玛莉亚: 实际年龄 = 15
玛莉亚: 虚拟年龄 = 18
安戈洛: 实际年龄 = 35
安戈洛: 虚拟年龄 = 32
在这里,ActialAge属性按预期工作。
但是,设置程序 setter 还有其他逻辑可以修改age属性的值。