最佳答案
在Kotlin中,如果你不想在构造函数内部或类主体顶部初始化一个类属性,你基本上有以下两个选项(来自语言引用):
lazy()
是一个接受lambda并返回Lazy<T>
实例的函数,该实例可以作为实现lazy属性的委托:对get()
的第一次调用执行传递给lazy()
的lambda并记住结果,对get()
的后续调用只是返回记住的结果。例子
public class Hello { val myLazyString: String by lazy { "Hello" } }
因此,myLazyString
的第一次调用和后续调用,无论它在哪里,都将返回Hello
通常,声明为具有非空类型的属性必须在构造函数中初始化。然而,这通常并不方便。例如,属性可以通过依赖注入初始化,或者在单元测试的设置方法中初始化。在这种情况下,不能在构造函数中提供非空初始化式,但在引用类主体中的属性时仍然希望避免空检查。
要处理这种情况,你可以用lateinit修饰符标记属性:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
修饰符只能用在类主体内部声明的var属性上(不能用在主构造函数中),且仅当该属性没有自定义getter或setter时使用。属性的类型必须是非空的,并且不能是基本类型。
那么,既然这两种方法都能解决同一个问题,如何在这两种方法中正确选择呢?