Kotlin阅读只有属性和无吸气

这些是否相同?

  • val foo = someFooReturningFunction()

  • val foo get() = someFooReturningFunction()

我理解他们的文档的方式,但在我自己的测试中,他们不是。

每次访问属性get() someFooReturningFunction()被评估,没有它只被评估一次。

他们不相同。 自定义getter的确在每个属性访问上评估,类似于普通函数,而没有自定义访问器的val属性仅在初始化时被评估一次(实际上存储在JVM平台上的final字段中)。

这里至少有几个不同:

  • 如果属性具有自定义getter(或者是open ,因此可能被自定义getter重写),则控制流分析和可空性推断将考虑到这一点,因为不能保证该属性在连续调用时返回相同的值:

     if (someObject.defaultGetterProperty != null) { someObject.defaultGetterProperty.let { println(it) } // OK } 

     if (someObject.propertyWithCustomGetter != null) { someObject.propertyWithCustomGetter { println(it) } // Error: cannot smart-cast } 
  • 当一个属性是private ,如果它没有自定义的getter,那么getter就不会被生成,并且直接访问后台字段。 但是,这是一个实现细节,不是依赖的东西。

不。除了@热键的原因,这里是一个简单的演示,使用可变属性显示,当他们绝对不等于。 TLDR:如果你的属性是使用可变属性计算的,那么总是在初始化器上使用自定义的getter。

 data class Calculation(val value1: Int, var value2: Int) { val sum: Int = value1 + value2 val sumWithGetter: Int get() = value1 + value2 } val calculation = Calculation(1, 2) println(calculation.sumWithGetter) // prints 3 println(calculation.sum) // prints 3 calculation.value2 = 0 println(calculation.sumWithGetter) // prints 1 (correct) println(calculation.sum) // prints 3!