Kotlin val различие getter override vs assign

Я начал играть с Котлином и прочитать кое-что о изменчивом знаке с обычным геттером. Как указано здесь, например, здесь или в Конвенции о кодировании Котлина, не следует переопределять геттер, если результат может измениться.

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 override значение не сохраняется. Есть ли что-то другое, где переопределение getter отличается от назначения? Может быть, с делегатами или латинитами?

В вашем втором примере size является неизменным значением, и поэтому оба способа действительны.

Однако вариант с переопределенным getter get() = size == 0 не имеет поля поддержки, поэтому size == 0 оценивается каждый раз, когда вы получаете доступ к переменной isEmpty .

С другой стороны, при использовании initializer = size == 0 size == 0 выражения size == 0 оценивается во время построения (точно проверяйте, когда и как здесь), подробный взгляд на инициализаторы Котлина ) и сохраняются в поле поддержки , значение, если затем возвращается при доступе к переменной.

Основное различие здесь заключается в том, что в val isEmpty get() = ... тело оценивается каждый раз при доступе к свойству, а в val isEmpty = ... выражение с правой стороны оценивается во время построения объекта, результат сохраняется в поле поддержки, и этот точный результат возвращается каждый раз, когда используется свойство.

Таким образом, первый подход подходит, когда вы хотите, чтобы результат был рассчитан каждый раз, в то время как второй подход хорош, когда вы хотите, чтобы результат был рассчитан только один раз и сохранен.