延迟加载属性
正常情况下,如果有一个不为空的属性,那么必须在构造器中对其赋值。然而在大多数情况下这不是很方便。比如属性初始化依赖注入信息,或者单元测试的设置方法。在这样的情形下,你不能再构造器中初始化一个不能为空的属性,但是你依然想避免空检查。为了处理这种情况,你可以将属性标记为lateinit。
public class MyTest {
lateinit var subject: TestSubject
@SetUp fun setup() {
subject = TestSubject()
}
@Test fun test() {
subject.method()
}
}
lateinit标识符只能用在var属性上,并且该属性被定义在class内部(而不是主构造器中定义),并且属性不能拥有自定义的getter和setter。这种类型的属性必须是不为空的,不能使原生数据类型。
在初始化前访问一个lateinit属性会抛出一个特定的异常,用来标识被访问的属性,并且指出其未被初始化。