【问题标题】:What are the implementation of default accessors in KotlinKotlin 中默认访问器的实现有哪些
【发布时间】:2018-05-14 20:12:52
【问题描述】:

我有这样的课

class Square(var width: Int, var height: Int) {
    var color : String = "red"
}

据我了解,Kotlin 的编译器会认为宽度、高度和颜色是 Square 类的属性,因此它会自动为这些属性生成 setter 和 getter。

有了属性颜色,我猜它的getter和setter应该是这样的

var color : String = "red"
get() = field
set(value) { field = value}

但是 width 和 height 属性的默认 setter 和 getter 怎么样。这些属性没有初始化值,因此它们在 getter 和 setter 中不能有“字段”标识符。有人知道答案吗?

【问题讨论】:

  • 我没有看到使用 field 标识符和存在初始值之间的联系。
  • @MarkoTopolnik 在 Kotlin 中,如果您不在 getter 或 setter 的主体内使用“字段”标识符,则可能不需要初始化该属性,例如:class Square(var width: Int, var height: Int) { val isSquare : Boolean get() = width == height } 但如果你像 get() = field 那样更改“isSquare”的getter,那么必须初始化“isSquare”属性。
  • 因为在第一个示例中根本没有支持字段,它是一个计算属性。这仍然与具有默认值无关。在您的情况下,所有属性都将有一个支持字段,只有一个具有默认值,另外两个必须传递给构造函数。

标签: kotlin


【解决方案1】:

如果您需要在类中存储简单的属性,并且您希望通过具有相同名称的构造函数参数来初始化它们,则放置在类声明头中的属性会很方便。如果你使用这些,你就放弃了为它们提供自定义 setter 和 getter 的能力——这只能对类主体中的属性进行。

否则,它们的 getter(以及 vars 的 setter)的默认实现与类主体中的属性相同。他们只是返回(并设置)支持字段的值。

编辑,跟进上面的 cmets:这也意味着构造函数中的属性总是必须被初始化,它们不能是计算属性,因为你不能给他们不会使用的 getter 和 setter他们的支持领域。

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 2020-12-08
    • 2023-04-10
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多