getter setter
kotlin getter,setter 跟java的不一样,我们直接看代码
class ThePerson(address: String, name: String) {
val age: Int
get() = 20
var address = address
get(){
println("get invoke")
//backing field
return field
}
set(value) {
println("set invoke")
field = value
}
var name = name
// private set
}
fun main(args: Array<String>) {
var person = ThePerson("shanghai", "zhangsan")
println(person.age)
println(person.address)
person.address = "beijing"
println(person.address)
println(person.name)
person.name = "hello"
println(person.name)
}
- 格式如下var propertyName: propertyType = initializer
getter()…
setter()… - 我们可以通过person.address 进行对属性的set get,可以看控制台打印结果,就是set get方法的调用
- 看如上field 为back field支撑字段,读写实际上操作的是支撑字段,field关键字只能在get() set()代码块中使用
- 字段val只能有get()代码块,var字段默认会生成一个自己的getter setter
如上理解都比较简单
属性延迟初始化
Kotlin中要求非空类型属性必须在构造方法中初始化:joy:,跟spring一起使用的时候,比如依赖注入,单元测试属性赋值,所以加上lateinit关键字
class TheClass {
lateinit var name: String
fun init() {
this.name = "zhangsan"
}
fun print() {
println(this.name)
}
}
fun main(args: Array<String>) {
var theClass = TheClass()
theClass.init()
theClass.print()
}
- lateinit 只能在类体var属性上,不能使用在primary constructor属性上
- 属性不能有自定义的getter setter
- 属性类型必须要求非空,而且不能是原生类型