3. Kotlin属性与字段

2019-10-28  本文已影响0人  努力生活的西鱼
Kotlin

属性与字段

声明属性

属性既可以使用关键字var声明为可变的,也可以用关键字val声明为只读的。

class Person {

    var name: String = firstName;

    var age: Int = 18;

    var city: String = "SH";
    
}

Getters和Setters方法

Kotlin中,GettersSetters方法是可选的,你如果没有在代码中创建它们,它是会默认自动生成。

class Property {

    var str:String? = null;

    var count:Int = 123;

}

初始化器(initializer),gettersetter都是可选的。
属性类型如果可以从初始化器(或者从其getter返回值)中推断出来,也可以省略。

 可变属性
var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]
 只读属性
val <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]

幕后字段

如果属性至少一个访问器使用默认实现,或者自定义访问器通过field引用幕后字段,将会为该属性生成一个幕后字段。

// 注意:这个初始器直接为幕后字段赋值
var counter = 0 
set(value) {
    if (value >= 0) field = value
}

幕后字段主要用于自定义settergetter中,并且只能在gettersetter中访问。

class Property {

    var str: String? = null
        get() {
            return field;
        }
        set(value) {
            field = value
        }

    var count: Int = 123
        get() {
            return field;
        }
        set(value) {
            field = value;
        }

}

幕后属性

对外表现为只读,对内表现为可读可写。

class Property {

    private var _table: Map<String, Int>? = null;

    public val table: Map<String,Int>
        get() {
            if (_table == null) {
                _table = HashMap(); // 类型参数已推断出
            }

            return _table ?: throw AssertionError("Set to null by another thread");
        }

}

_table属性声明为private,因此外部是不能访问的,内部可以访问,外部访问通过table属性,而table属性的值,取决于_table,这里_table就是幕后属性。

编译期常量

已知值的属性可以使用const修饰符标记为编译期常量。

延迟初始化属性与变量

一般地,属性声明为非空类型必须要在构造函数中初始化。然而这经常不方便。

为处理这种情况,你可以用lateinit修饰符标记该属性:

public class MyTest {
    lateinit var subject: TestSubject
    @SetUp fun setup() {
        subject = TestSubject()
    }
    @Test fun test() {
        subject.method() // 直接解引⽤
    }
}

该修饰符只能用于在类体中的属性(不是在主构造函数中声明的var属性,并且仅当该属性没有自定义getter和setter时),而自Kotlin1.2起,也用于顶层属性与局部变量。该属性或变量必须为非空类型,并且不能是原生类型。

上一篇 下一篇

猜你喜欢

热点阅读