Kotlin val差异getter覆盖vs作业
问题描述:
我开始和Kotlin一起玩arround,并用自定义getter读了一些关于mutable val的内容。如例如here或Kotlin 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覆盖是不同的分配?也许与代表或拉丁美洲?
答
在第二个示例中size
是不可变的值,因此这两种方法都是有效的。
但是变异与重写吸气get() = size == 0
has no backing field因此size == 0
评估每次访问isEmpty
可变时间。
在另一方面,使用初始化= size == 0
当表达size == 0
在施工过程中评估(检查什么时候以及如何在这里 - An in-depth look at Kotlin’s initializers),并存储到backing field,价值,如果这时候你访问变量,然后返回。
答
这里的关键区别在于,在val isEmpty get() = ...
身体的每个属性被访问时评估,并且在val isEmpty = ...
在右手侧的表达式中的对象构造期间被评估,结果被存储在the backing field和此完全相同的结果每次使用该属性时都会返回。
因此,第一种方法适用于每次需要计算结果的情况,而第二种方法适用于仅计算一次并存储结果的情况。