2017-08-01 5 views
3

私はKotlinでarroundを演奏し、カスタム・ゲッターで可変のvalを読み始めました。たとえばhereまたはKotlin Coding Conventionのように、結果が変わる可能性がある場合はゲッターをオーバーライドしないでください。コットン・ヴァル・ゲッター・オーバライド対代入

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 
} 

がある私はゲッターの値をオーバーライドすることを見ることができたガイドラインのような使用法の観点からは保存されません。ゲッターのオーバーライドが割り当てと異なるところに何か他のものがありますか?たぶん、代議員やlatinitと?

答えて

4

第2の例では、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に格納され、この正確な結果でありますプロパティが使用されるたびに返されます。

結果が毎回計算されるようにするには、最初のアプローチが適していますが、2回目のアプローチは、結果を1回だけ計算して保存する場合に適しています。

関連する問題