Kotlin 字段和属性

Kotlin中没有显式定义的字段,只有属性。

完整的属性定义语法如下:

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

所有属性必须初始化,(声明时设置初始值,或者在构造函数中初始化)。getter和setter是可选的,如果类型可以被推断出来(通过初始值或者getter)那么属性类型可以省略。

幕后字段

虽然无法在Kotlin中显式定义字段,但是每一个字段都有一个幕后字段,幕后字段只能在getter和setter中使用field关键字访问

var count = 0 //直接初始化隐含的 field 字段,属性类型可以通过初始化参数直接推断。
    set(value) {
        if(value >= 0) field = value
    }

除非属性使用默认的getter和setter实现,或者在自定义的实现中访问field,否则编译器不会创建隐含的幕后字段。

如果幕后字段没有办法满足需求,可以使用private property来当做属性的“幕后属性“使用,实际上这就和Java中将属性设置为private并提供public getter 和 setter 的方法是一样的。如下:

private var _table: Map = null
public val table: Map
    get() {
        if(_table == null) {
            _table = HashMap()
        }
        return _table ?: throw AsssertionError("")
    }

编译器常量

使用const 关键字。

延迟初始化属性

一个非空属性必须在在声明时提供初始值或者在构造函数中初始化。某些情况下这么做可能会不方便,lateinit关键字可以标记一个var属性,并允许其不在构造函数中初始化或在声明时提供初始值。标记要求属性使用默认的getter和setter,并且属性必须是non-null且不是原始类型

你可能感兴趣的:(Kotlin)