这些是等价的吗?
val foo = someFooReturningFunction()
val foo get() = someFooReturningFunction()
我理解他们的文档的方式,但在我自己的测试中他们不是.
随着get()方法 someFooReturningFunction()
中的每个属性被访问时评价,没有它,只计算一次.
他们并不等同.确实对每个属性访问评估了自定义getter,类似于普通函数,而val
没有自定义访问器的属性仅在初始化时被评估一次(并且实际上存储在final
JVM平台上的字段中).
以下是至少一些差异:
如果属性具有自定义getter(或者open
因此可能被自定义getter覆盖),则控制流分析和可空性推理将其考虑在内,因为无法保证属性在连续调用时返回相同的值:
if (someObject.defaultGetterProperty != null) {
someObject.defaultGetterProperty.let { println(it) } // OK
}
Run Code Online (Sandbox Code Playgroud)
if (someObject.propertyWithCustomGetter != null) {
someObject.propertyWithCustomGetter { println(it) } // Error: cannot smart-cast
}
Run Code Online (Sandbox Code Playgroud)当属性为private
,如果它没有自定义getter,则根本不生成getter,直接访问后备字段.然而,这是一个实现细节,而不是依赖的东西.
归档时间: |
|
查看次数: |
3467 次 |
最近记录: |