Есть ли способ, которым я могу сделать частный установщик и публичный получатель в классе данных Kotlin?

data class Test(var attribute: String) {

    // attribute can be mutated inside this class

    // but outside only readable ?
}
3
Dachstein 29 Май 2019 в 02:08

2 ответа

Лучший ответ

Простой подход состоит в том, чтобы иметь частную переменную, но затем предоставить открытое свойство, которое делегирует ее:

data class Test (private var attribute_ : String) {
  val attribute: String get() = attribute_
}
9
Louis Wasserman 28 Май 2019 в 23:25

Чтобы добавить фон к другому ответу:

Нет никакого способа сделать это непосредственно в конструкторе, хотя было несколько предложений относительно того, как это может быть добавлено к языку; см. здесь.

Если бы это был не класс данных, я бы предложил эту альтернативу:

class Test(_attribute: String) {
    var attribute = _attribute
        private set
}

Это хранит только одно значение в объекте, поэтому немного более эффективно.

Но так как это класс данных, это невозможно. (Классы данных не могут иметь не-свойств в своих первичных конструкторах.) Так что предложение другого ответа кажется лучшим.

2
gidds 29 Май 2019 в 08:19