Kotlin 可空成员的延迟初始化
如果我们有一个成员变量定义为Kotlin 可空成员的延迟初始化,kotlin,Kotlin,如果我们有一个成员变量定义为 private var foo: Foo? = null 当我们调用一个带有参数的方法(初始化Foo需要参数)时,我们想要初始化它,有没有比这更好的方法呢 fun generateFoo(bar: Bar): Foo { var localFoo = foo if (localFoo == null) { localFoo = Foo(bar) foo = localFoo } return loca
private var foo: Foo? = null
当我们调用一个带有参数的方法(初始化Foo需要参数)时,我们想要初始化它,有没有比这更好的方法呢
fun generateFoo(bar: Bar): Foo {
var localFoo = foo
if (localFoo == null) {
localFoo = Foo(bar)
foo = localFoo
}
return localFoo
}
我正在考虑避免所有的变量赋值
编辑:这里有一个略短的版本,但仍然不理想
fun generateFoo(bar: Bar): Foo {
var localFoo = foo ?: Foo(bar)
foo = localFoo
return localFoo
}
这是安全的,除非您的类中有多个线程:
fun generateFoo(bar: Bar): Foo {
if (foo == null) {
foo = Foo(bar)
}
return foo!!
}
但是,如果您愿意,您可以这样做-取决于您是否认为这比您已有的较长版本更具可读性:
fun generateFoo(bar: Bar) = foo ?: Foo(bar).also { foo = it }
在这里使用局部变量有什么特别的原因吗?难道不存在专门用于此目的的
lazy
和/或late init运算符吗?@Francesc认为zsmb意味着您不需要localFoo
变量。我能想到的最短方法是:foo=foo?:foo(bar);return foo
此代码存在概念缺陷。考虑调用<代码> GealFooO两次不同的代码> bar < /代码> s。第二次,它将返回一个Foo
,其中包含上一个Bar
实例,而不是对应的实例。您可以执行returnfoo你的第一个解决方案并不比问题中列出的我的好,但第二个更简洁。虽然仍然不完全是我想要的(理想情况下,我希望有一个懒汉,我们可以通过一个论点,但这可能不存在),我接受它作为正确的答案。