Kotlin只读有和没有吸气剂的财产

chr*_*man 10 kotlin

这些是等价的吗?

  • val foo = someFooReturningFunction()

  • val foo get() = someFooReturningFunction()

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

随着get()方法 someFooReturningFunction()中的每个属性被访问时评价,没有它,只计算一次.

hot*_*key 8

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

以下是至少一些差异:

  • 如果属性具有自定义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,直接访问后备字段.然而,这是一个实现细节,而不是依赖的东西.