Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[kotlin]Kotlin的getter setter,属性延迟初始化 #7

Open
zhangjin-007 opened this issue Feb 22, 2018 · 0 comments
Open

[kotlin]Kotlin的getter setter,属性延迟初始化 #7

zhangjin-007 opened this issue Feb 22, 2018 · 0 comments

Comments

@zhangjin-007
Copy link
Owner

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
  • 属性类型必须要求非空,而且不能是原生类型
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant