8.Kotlin属性揭秘与延迟初始化特性

1.属性

  • 示例代码
/**
 * var propertyName:propertyType = initializer
 *      getter()...
 *      setter()...
 *      backing field,支撑字段(域)
 *      backing property,支撑属性
 */
class ThePerson(address: String, name: String) {
    val age: Int
        get() = 20

    var address: String = address
        get() {
            println("get invoked")
            return field
        }
        
        set(value) {
            println("set invoke")
            field = value
        }
    var name: String = name


}

fun main(args: Array) {
    var person = ThePerson("shanghai", "zhangsan");

    println(person.age)

    person.address = "tianjin"
    println(person.address)

    println(person.name)

    person.name = "lisi"

    println(person.name)


}
  • 运行结果
20
set invoke
get invoked
tianjin
zhangsan
lisi

2.延迟初始化属性

延迟初始化属性
Kotlin要求非空类型的属性必须要在构造方法中进行初始化
有时,这种要求不太方便,比如可以通过依赖注入或者单元测试情况下进行属性的赋值。

通过lateinit关键字标识属性为延迟初始化,需要满足如下3个条件:
1.lateinit只能用在类体中声明的var属性上,不能用在parimary constructor声明的属性上
2.属性不能拥有自定义的setter与getter
3.属性类型需要为非空,且不能是原生数据类型

  • 示例代码
class TheClass {
    lateinit var name: String

    fun init() {
        this.name = "zhangsan"
    }

    fun print() {
        println(this.name)
    }
}

fun main(args: Array) {
    var theClass = TheClass();

    theClass.init()
    theClass.print()
}
  • 运行结果
zhangsan

你可能感兴趣的:(8.Kotlin属性揭秘与延迟初始化特性)