Как вы инициализируете ненулевое свойство как указатель this в классе данных kotlin? - PullRequest
0 голосов
/ 10 декабря 2018

Учитывая класс данных Kotlin, как вы инициализируете ненулевое свойство как указатель на себя?Т.е. что-то вроде следующего псевдокода.

data class Node(var other: Node = this)

В настоящее время у меня есть решение, которое вводит временные свойства

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

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Спасибо за ваш отзыв, однако для моих целей мне нужны функциональные возможности класса данных, такие как 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 был параметром по умолчанию).

0 голосов
/ 10 декабря 2018

Это невозможно.Вы не можете получить доступ к this до его создания.Но так будет работать параметр конструктора по умолчанию.

Cannot access '<this>' before superclass constructor has been called
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...