Kotlin 属性

属性和 Java 类似, 可以是 var 或者 val, 可以加可见性修饰符。
声明属性的完整语法是:

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

var name: String
    get() = field - 1
    set(value) {
        field = value -1
    }

Kotlin 提供了一种自动的后端域变量, 可以通过 field 标识符来访问。

一般情况不会修改属性的 getter 和 setter, 使用默认实现就可以,如上的代码并不常用。常用的是修改可见性,如下示例:

var name: String
    private set // 可见度为 private, 并使用默认实现
  • 常量

如果属性值在编译期间就能确定, 则可以使用 const 修饰符,达到 Java 里面的 final static 常量的效果。
但是必须是顶级属性,或者 object 的成员,如:

const val DEBUG = true

class Hello {
    companion object {
        const val TAG = "hello"
    }
}
  • 延迟初始化属性

通常, 如果属性声明为非 null 数据类型, 那么属性值必须在构造器内初始化。这种情况带来一些不便,比如有些属性在setup()的时候初始化。这种情况,可以将属性声明为可空变量, 但是会带来 null 值检查。这种情况可以为属性添加lateinit修饰。

class Hello {
    private lateinit var persion: Persion
    fun setup(persion: Persion) {
        this.persion= persion
    }
    fun test() {
        println(persion.name)
    }
}

lateinit 只能用于 var 类属性, 属性类型必须是非 null 的, 而且不能是基本类型。lateinit 属性被初始化之前访问它, 会抛出一个特别的异常。

  • 覆盖属性

和方法的覆盖类似,open 的 属性可以被覆盖,但是属性的类型需要一致。

open class Base {
    open protected val x = 10
}

class Hello: Base() {
    override var x = 12
}

val 可以修改成 var, 反过来不行。

参考
《Programming Kotlin》Stephen Samuel ,Stefan Bocutiu
《Kotlin in Action》Dmitry Jemerov,Svetlana Isakova

    原文作者:jinkui
    原文地址: https://www.jianshu.com/p/3c414c83f8c1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞