Kotlin - "computed"var 属性的用处?

标签 kotlin

我注意到,当我有一个带有自定义 getvar 属性时,它不使用 field 标识符,支持字段是无论如何生成。我检查了字节码,文档也这么说:

A backing field will be generated for a property if it uses the default implementation of at least one of the accessors, or if a custom accessor references it through the field identifier.
(emphasis is mine)

考虑这样的类(class)。由于它是一个 var 属性,因此将生成一个默认的 set(因此也是一个支持字段):

class Banana {
    var ripeness = 1

    var color: String = "green"
        get() = when {
            ripeness > 80 -> "brown"
            ripeness > 50 -> "yellow"
            else -> "green"
        }
}

val b = Banana()
b.color = "blue"

println(b.color)

但是,无论我将 color 设置为什么,println 都会始终打印“绿色”。无论如何,支持字段将设置为“蓝色”。
由于无法在访问器方法之外(或通过反射)访问它,我真的想不出原因。 我在这里错过了什么吗?也许是一个用例或其他访问支持字段的方式?还是只是一个错误(或 IntelliJ 中缺少警告)?

最佳答案

具有未使用的支持字段的“计算”var 属性应该是“计算”val 属性.

如果您不打算在示例中使用支持字段,那么 Banana.color 不应该是 var 而是 val .例如:

class Banana {
    var ripeness = 1

    val color: String
        get() = when {
            ripeness > 80 -> "brown"
            ripeness > 50 -> "yellow"
            else -> "green"
        }
}

另一方面,如果您确实想让您的“计算”属性在某些情况下可被覆盖,那么您将需要实际使用支持字段。例如:

class Banana {
    var ripeness = 1

    var color: String = "green"
        get() = when {
            ripeness > 80 -> "brown"
            ripeness > 50 -> "yellow"
            else -> field
        }
}

关于Kotlin - "computed"var 属性的用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41279312/

相关文章:

android - 对一组闪烁的可组合项进行动画处理,控制同步/计时

intellij-idea - Intellij IDEA 插件开发。操作 "create kotlin class"

java - 为什么 Kotlin 的内部可访问性与 Java 的包私有(private)可访问性不同?

android - Saripaar formvalidation 在 kotlin 中第二次不起作用

android - 为什么懒惰的kotlin会导致android中的内存泄漏?

variables - 如何在 kotlin 中修改其范围之外的变量?

kotlin - 我如何编写惯用的Kotlin代码来循环子流程并处理其输出?

android - StaggeredGridLayoutManager 正在加载左侧的一项,其余的加载右侧

kotlin - 如何以函数式风格生成一定长度的非穷举排列

java - 使用向左/向右拖动来倒回可绘制的动画