2017-09-27 197 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