2017-09-27 122 views
1

如果我们有定义为可空构件的延迟初始化

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 
} 
+2

在这里有一个局部变量有特别的理由吗? – zsmb13

+0

为了这个目的,没有'懒惰'和/或晚期的init操作符吗? – jdv

+0

懒惰不允许在此处初始化Foo所需的参数。 – Francesc

回答

3

这是安全的,除非你有多个线程打你的类:

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

但是,如果你愿意,你可以做这样的事情 - 不管你认为这是否比已有的较长版本更具可读性:

fun generateFoo(bar: Bar) = foo ?: Foo(bar).also { foo = it } 
+0

你的第一个解决方案并不比我列出的问题好,但第二个解决方案更简洁。虽然仍然不完全是我所追求的(我理想的情况是我们可以通过懒惰来传递一个参数,但这可能不存在),但我接受它作为正确的答案。 – Francesc