Спасибо за ваш отзыв, однако для моих целей мне нужны функциональные возможности класса данных, такие как equals and copy, и я бы предпочел не делать свойство обнуляемым и / или реализовывать эту функциональность вручную.
Вам все равно придется: equals
и copy
заботиться только о _other
и игнорировать other
(так же, как они игнорировали бы все другие свойства, определенные в теле класса),То, что other
является var
, только усугубляет ситуацию: переназначение его не повлияет на функциональность класса данных.
Но вы можете подойти ближе:
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
был параметром по умолчанию).