总是更喜欢属性而不是支持字段是否被认为是惯用的?
Is it considered idiomatic to always prefer properties over backing fields?
我最近使用 Android Studio 的 Kotlin 插件将 Android 项目从 Java 转换为 Kotlin。 Post-转换,我的 类 中的许多字段被突出显示,将鼠标悬停在它们上面会显示消息
This property has a backing field
我是否应该从这个 message/warning 的存在推断出使用具有显式定义的 getter and/or setter 的属性总是被认为更惯用(在 Kotlin 中)?还是 IDE 对信息性消息有点过分热心?首选包含对官方来源的引用的答案:)
不用担心,这是 IDE 的一个已知问题。突出显示仅供您参考,因为在某些情况下支持字段需要格外小心。
如果嫌麻烦,关掉检查就好了。或者把高亮调的不那么亮
惯用语是使用没有支持属性的属性。支持属性是一个例外情况,自定义 getter 和 setters 也是如此。您确实需要了解 "Backing Field" 和 "Backing Property" 之间的区别:
在 Kotlin 文档中,它讨论了 Backing Fields,这是您有时可以从自定义 getters/setters 访问的内容,并且存在于任何给定的 属性 中。 field
的支持字段有一个隐含名称,因此在 setter 中,您将通过该名称访问此支持字段:
var counter = 0 // the initializer value is written directly to the backing field
set(value) {
if (value >= 0)
field = value
}
另一方面,A 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")
}
我最近使用 Android Studio 的 Kotlin 插件将 Android 项目从 Java 转换为 Kotlin。 Post-转换,我的 类 中的许多字段被突出显示,将鼠标悬停在它们上面会显示消息
This property has a backing field
我是否应该从这个 message/warning 的存在推断出使用具有显式定义的 getter and/or setter 的属性总是被认为更惯用(在 Kotlin 中)?还是 IDE 对信息性消息有点过分热心?首选包含对官方来源的引用的答案:)
不用担心,这是 IDE 的一个已知问题。突出显示仅供您参考,因为在某些情况下支持字段需要格外小心。
如果嫌麻烦,关掉检查就好了。或者把高亮调的不那么亮
惯用语是使用没有支持属性的属性。支持属性是一个例外情况,自定义 getter 和 setters 也是如此。您确实需要了解 "Backing Field" 和 "Backing Property" 之间的区别:
在 Kotlin 文档中,它讨论了 Backing Fields,这是您有时可以从自定义 getters/setters 访问的内容,并且存在于任何给定的 属性 中。 field
的支持字段有一个隐含名称,因此在 setter 中,您将通过该名称访问此支持字段:
var counter = 0 // the initializer value is written directly to the backing field
set(value) {
if (value >= 0)
field = value
}
另一方面,A 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")
}