2017-09-01 27 views
0

我是kotlin的新手,無法找出此問題。不能使用具有委託屬性的自定義獲取者

我有一個不可空的屬性,可能會或可能不會被使用。 因此,我已委派它在一個懶惰的方式,以便它在需要時被初始化。

private val labelAnimator: ObjectAnimator by lazy { 
    ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) 
} 

不過,我還需要設置每一個被訪問時該對象的某些屬性。

fun getLabelAnimator(): ObjectAnimator { 
    labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong() 
    return labelAnimator 
} 

但我不能使用自定義getter,因爲該屬性被委託。 如何以最佳方式實現此目標?

+2

雖然這不能回答你的問題,但我強烈建議不要在吸氣劑中改變屬性。這違反了最少驚喜的原則。 –

回答

0

我不是Kotlin的專家,但這聽起來不對。 通過委託給懶惰你想要初始化對象的第一個getter調用。然後,你正在嘗試寫自定義的getter。 我在那裏看到衝突。

可能:

private val labelAnimator: ObjectAnimator by lazy { 
    val labelAnimator = ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) 
    labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong() 
    labelAnimator 
} 
+0

每次訪問該屬性時都不會創建一個新對象嗎? –

+0

你是對的!我將編輯答案 –

1

例如,您可以使用原來的財產Backing Property,實際上定義屬性作爲一個代表團到它。

private val _labelAnimator by lazy { 
    ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) 
} 

val labelAnimator: ObjectAnimator 
    get() { 
     _labelAnimator.duration = if (isFloatingLabelAnimating) 300L else 0L 
     return _labelAnimator 
    } 

這讓您在的Java和直接財產訪問科特林一個getLabelAnimator()方法

但是就像之前說過的那樣,它可能不是實現此類行爲的最佳方式。一個簡單的工廠可以做很少的開銷。