2017-08-01 50 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和此完全相同的结果每次使用该属性时都会返回。

因此,第一种方法适用于每次需要计算结果的情况,而第二种方法适用于仅计算一次并存储结果的情况。