2017-08-01 51 views
3

我開始和Kotlin一起玩arround,並用自定義getter讀了一些關於mutable val的內容。如例如hereKotlin Coding Convention所述,如果結果可以改變,則不應該重寫吸氣劑。Kotlin val差異getter覆蓋vs作業

class SampleArray(val size: Int) { 
    val isEmpty get() = size == 0 // size is set at the beginning and does not change so this is ok 
} 

class SampleArray(var size: Int) { 
    fun isEmpty() { return size == 0 } // size is set at the beginning but can also change over time so function is prefered 
} 

但是,僅僅從使用的角度作爲指導方針,其中從this答案,我可以看到,吸氣劑覆蓋的值不存儲在以下兩個

class SampleArray(val size: Int) { 
    val isEmpty get() = size == 0 // size can not change so this can be used instad of function 
    val isEmpty = size == 0  // isEmpty is assigned at the beginning ad will keep this value also if size could change 
} 

之間的差異。還有什麼地方的getter覆蓋是不同的分配?也許與代表或拉丁美洲?

回答

4

在第二個示例中size是不可變的值,因此這兩種方法都是有效的。

但是變異與重寫吸氣get() = size == 0has no backing field因此size == 0評估每次訪問isEmpty可變時間。

在另一方面,使用初始化= size == 0當表達size == 0在施工過程中評估(檢查什麼時候以及如何在這裏 - An in-depth look at Kotlin’s initializers),並存儲到backing field,價值,如果這時候你訪問變量,然後返回。

1

這裏的關鍵區別在於,在val isEmpty get() = ...身體的每個屬性被訪問時評估,並且在val isEmpty = ...在右手側的表達式中的對象構造期間被評估,結果被存儲在the backing field和此完全相同的結果每次使用該屬性時都會返回。

因此,第一種方法適用於每次需要計算結果的情況,而第二種方法適用於僅計算一次並存儲結果的情況。