【问题标题】:Accessing field of a different instance of the same class in Kotlin在 Kotlin 中访问同一类的不同实例的字段
【发布时间】:2017-10-20 01:23:26
【问题描述】:

考虑一下这个 Kotlin 代码:

var parent: T? = null
    get() = if (isParent) this as T else field
    set(value) { field = if (value == null) null else value.parent }

val isParent: Boolean
    get() = parent == null

var description = ""
    get() = if (isParent) field else parent!!.description
    set(value) { if (isParent) field = value else parent!!.description = value }

假设isParent 返回true,如果此实例是parent 实例。如果不是 getParent() 将返回父实例。在 Java 中,您可以像这样直接访问同一类的不同实例的字段:

String getDescription() { return getParent().description; }
void setDescription(String value) { getParent().description = value; }

(我并不是说这是最好的做法,我简化了它以进行演示)。与 Java 相比,如果能够做到以下几点就好了:

var description = ""
    get() = parent.field
    set(value) { parent.field = value }

但是这不起作用,不幸的是它使代码的可读性降低。特别是如果你有很多这样的变量,这些变量都绑定到这个parent

【问题讨论】:

  • 你考虑过使用backing property吗?据我所知,Kotlin 不允许绕过自定义 getter。以前是这样,但现在不是了。
  • 为什么parentisParent 在getter 上互相调用?这应该会导致无限递归问题
  • @voddan 这可能是真的,我仍在理论上进行实验。这应该如何正确完成?
  • 不幸的是,我不知道这段代码应该做什么。我可以改进一些位,但整体算法包含错误,所以我无法理解它是如何工作的。尝试包含一个单元测试,让我能够验证代码的行为。

标签: kotlin


【解决方案1】:

属性的支持字段只能从该属性的 getter 或 setter 访问,并且只能用于调用 getter 或 setter 的实例。如果您需要提供多种方法来访问类的属性,则需要定义两个不同的属性,其中一个具有用于存储数据的支持字段,另一个具有引用第一个属性的 getter 和 setter。

class Foo {
    var parent: Foo? = null

    val parentOrSelf: Foo get() = parent ?: this

    private var _description: String? = null

    var description = ""
         get() = parentOrSelf._description
         set(value) { parentOrSelf._description = value }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多