惰性成员的惰性初始化

如果我们有一个成员variables定义为

private var foo: Foo? = null 

当我们调用带有参数的方法(需要初始化Foo)时,我们想要初始化它,还有更好的方法吗?

 fun generateFoo(bar: Bar): Foo { var localFoo = foo if (localFoo == null) { localFoo = Foo(bar) foo = localFoo } return localFoo } 

我正在考虑避免所有的variables赋值。

编辑:稍微短一点的版本在这里,但仍然不理想

 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 }