如何在Kotlin数据类中将非空属性初始化为this指针?

时间:2018-12-10 10:01:05

标签: kotlin

给出Kotlin数据类,如何将非空属性初始化为指向self的指针?即类似以下的伪代码。

data class Node(var other: Node = this)

目前,我有一个介绍临时属性的解决方案

data class Node(val _other: Node? = null) {
    var other: Node = _other ?: this
}

2 个答案:

答案 0 :(得分:2)

这是不可能的。 this不能在构造之前访问。但这就是默认构造函数参数的工作方式。

Cannot access '<this>' before superclass constructor has been called

答案 1 :(得分:1)

  

谢谢您的反馈,但是,出于我的目的,我需要equals和copy之类的数据类的功能,并且我不希望使该属性为可空性和/或手动实现该功能。

您仍然必须:equalscopy仅关心_other并忽略other(就像它们将忽略正文中定义的所有其他属性一样)类)。 othervar只会使情况变得更糟:重新分配它不会对数据类功能产生影响。

但是您可以靠近:

data class Node(private var _other: Node? = null) {
    var other: Node
        get() = _other ?: this
        set(value) {
            _other = if (value != this) value else null
        }
}

唯一的问题是component1()将返回_other。在这种情况下,您只有一个属性,所以没关系。

编辑:再想一想,

data class Node(private var _other: Node? = null) {
    init {
        this._other = _other ?: this
    }

    var other: Node
        get() = _other!! // safe
        set(value) {
            _other = value
        }
}

似乎有效地成为了您想要的。您可以在这里看到区别:

val node1 = Node()
val node2 = node1.copy(node1)
println(node1 == node2)

使用第一个解决方案打印false,使用第二个解决方案打印true(如果this是默认参数,则应该打印)。