Kotlin 属性语法 Getters和Setters

kotlin属性声明有两个关键字

  • var: 声明为可变属性,可以延迟加载初始值,可以修改变量属性的值,与Java声明变量类似
  • val: 声明为只读属性, 声明时必须赋初始值并且不能修改,相当于Java中的final
1
2
3
var name : String? = null
lateinit var addrees : String // 延迟初始化
val id : String = "123456789"

声明一个属性的完整语法:

1
2
3
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]

Getters和Setters

其初始器(initializer)、getter 和 setter 都是可选的(注意:val只读属性没有setter)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
val age : Int
get() = 20
var name : String = "Alice"
get(){
println("get:" + field)
return field
}
set(value){ // 参数的名称是 value 可以根据喜好修改
println("set: " + field)
field = value
}

fun main(args: Array<String>) {
if(name == "Alice"){
name = "Bill"
}

}

执行结果

1
2
get:Alice
set: Alice

获取name的值执行get 给name赋值时执行set
当然也可以加入判断语句,比如属性name不允许返回字符串”Alice”; 不允许属性的值是”Bill”
这就和Java中将属性变量设置为private并提供public getter 和 setter 的方法是一样的;因为通过默认 getter 和 setter 访问私有属性会被优化,所以不会引入函数调用开销。

1
2
3
4
5
6
7
8
9
10
11
12
name: String = "Alice"
get() {
if ("Alice".equals(field)) {
return "Michael"
}
return field
}
set(value) { // 参数的名称是 value 可以根据喜好修改
if (!"Bill".equals(field)) {
field = value
}
}

幕后字段 field

上面代码里出现的字段field 是Kotlin自动提供叫幕后字段(类似 this 和 it); 只能在属性的get和set中使用,对应的还有幕后属性

幕后属性

1
2
3
4
5
6
7
8
private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
get() {
if (_table == null) {
_table = HashMap() // 类型参数已推断出
}
return _table ?: throw AssertionError("Set to null by another thread")
}