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