Kotlin val差异getter覆盖vs分配

我开始和Kotlin一起玩,并且用自定义的getter读了一些关于mutable val的东西。 正如在这里或在Kotlin编码公约中所提到的,如果结果可以改变的话,不应该重写getter。

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 } 

但是从使用的角度来看,这个指南的区别在于以下两点之间的区别

 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覆盖的值是不存储的。 还有什么地方的getter覆盖是不同的分配? 也许与代表或拉丁美洲?

在你的第二个例子中, size是不可变的值,因此这两种方法都是有效的。

但是,重写getter get() = size == 0变体没有后台字段 ,因此每次访问isEmpty变量时都会计算size == 0

另一方面,当使用initializer = size == 0 ,表达式的size == 0在构造期间被评估(仔细检查这里的时间和方式 – 深入研究Kotlin的初始化器 )并存储到后台字段中 ,如果然后在访问变量时返回。

这里的关键区别在于, val isEmpty get() = ...每次访问属性时都会评估正文,而val isEmpty = ...在对象构造期间评估右侧的表达式,结果存储在后台字段中 ,每次使用该属性时都会返回该确切结果。

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