属性与字段
声明属性
属性既可以使用关键字var
声明为可变的,也可以用关键字val
声明为只读的。
class Person {
var name: String = firstName;
var age: Int = 18;
var city: String = "SH";
}
Getters和Setters方法
在Kotlin
中,Getters
和Setters
方法是可选的,你如果没有在代码中创建它们,它是会默认自动生成。
class Property {
var str:String? = null;
var count:Int = 123;
}
初始化器(initializer)
,getter
和setter
都是可选的。
属性类型如果可以从初始化器(或者从其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
}
幕后字段主要用于自定义setter
和getter
中,并且只能在getter
和setter
中访问。
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起,也用于顶层属性与局部变量。该属性或变量必须为非空类型,并且不能是原生类型。
网友评论