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