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!
- 致命exception:与Klaxon json Kotlin库的java.lang.RuntimeException
- 为什么我可以在Kotlin中定义一个没有类的变量?
- 在kotlin测试
- 如果提供RxJava Observable,Kotlin密封类子类需要被转换为基类
- 当参数不可为空时,空值检查不会插入到实体类型中
- 对Json TypeToken的EmptyClassBlock皮棉投诉
- Kotlin库'classes.jar'具有不受支持的格式。 请更新库或插件
- 执行失败的任务'应用程序:copyDebugAndroidTestKotlinClasses' – Android的Kotlin生成错误
- 如何获得Kotlin上的网页内容