是否习惯于首选属性而不是支持字段?

时间:2015-11-18 04:05:24

标签: android-studio kotlin

我最近使用Android Studio的Kotlin插件将Android项目从Java转换为Kotlin。转换后,我的课程中的许多字段都被突出显示,并将鼠标悬停在它们上面会显示消息

  

此属性具有支持字段

"deep copy"

我是否应该从这个消息/警告的存在推断出它总是被认为是更惯用的(在Kotlin中)使用具有明确定义的getter和/或setter的属性?或者IDE是否对信息性消息有点过分热心?包含对官方来源的引用的答案首选:)

2 个答案:

答案 0 :(得分:3)

惯用法是使用没有支持属性的属性。支持属性是一种例外情况,自定义getter和setter也是如此。您需要了解“Backing Field”和“Backing Property”之间的区别:

在Kotlin文档中,它讨论了Backing Fields,有时您可以从自定义getter / setter访问这些内容并存在于任何给定属性中。支持field字段的隐含名称,因此在setter中您可以使用该名称访问此支持字段:

var counter = 0 // the initializer value is written directly to the backing field
  set(value) {
    if (value >= 0)
      field = value
  }

另一方面,Backing Property是您定义的值,用于将值存储在另一个私有属性中,并且您可以完全控制该属性。按照惯例,它将是private并以下划线_作为前缀。这看起来像:

private var _table: Map<String, Int>? = null

public val table: Map<String, Int>
  get() {
    if (_table == null)
      _table = HashMap() // Type parameters are inferred
    return _table ?: throw AssertionError("Set to null by another thread")
  }

答案 1 :(得分:2)

没有什么可担心的,这是IDE的一个已知问题。突出显示仅仅是为了您的信息,因为在某些情况下,支持字段需要额外注意。

如果您遇到麻烦,请关闭检查。或者将突出显示更改为不那么明亮。