gpt4 book ai didi

Kotlin 只读属性,带和不带 getter

转载 作者:IT老高 更新时间:2023-10-28 13:40:07 40 4
gpt4 key购买 nike

这些是等价的吗?

  • 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
    }

    if (someObject.propertyWithCustomGetter != null) {
    someObject.propertyWithCustomGetter { println(it) } // Error: cannot smart-cast
    }
  • 当一个属性是private时,如果它没有自定义getter,则根本不会生成getter,直接访问支持字段。然而,这是一个实现细节,不能依赖。

关于Kotlin 只读属性,带和不带 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42144136/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com