Шаг 186.
Основы Kotlin.
Объекты. Классы данных. Деструктуризация объявлений

    На этом шаге мы рассмотрим преимущества и недостатки деструктуризации.

    Еще одно преимущество классов данных - поддержка автоматической деструктуризации данных.

    Ранее вы уже видели пример деструктуризации данных, возвращаемых функцией split(). Под внешней оболочкой деструктуризация опирается на функции с именами componentl, component2 и т. д. Каждая функция предназначена для извлечения части данных, которую вы хотите вернуть. Классы данных автоматически добавляют эти функции для каждого свойства, объявленного в главном конструкторе.

    В деструктуризации нет ничего волшебного: класс данных просто выполняет эту работу сам, чтобы сделать класс "деструктурированным". Можно сделать любой класс деструктурированным, добавив функцию-оператор component(), как в примере:

class PlayerScore(val experience: Int, val level: Int){ 
    operator fun component1() = experience 
    operator fun component2() = level
}
val (experience, level) = PlayerScore(1250, 5)

    Объявив Coordinate как класс данных, вы сможете вернуть свойства, объявленные в главном конструкторе Coordinate:

  val (x, y) = Coordinate(1, 0)

    В этом примере х имеет значение 1, так как componentl возвращает значение первого свойства, объявленного в главном конструкторе Coordinate. Переменная у имеет значение 0, потому что component2 возвращает второе свойство, объявленное в главном конструкторе Coordinate.

    Эти особенности добавляют веса использованию классов данных для выражения простых объектов, содержащих информацию, таких как Coordinate. Классы, которые часто сравниваются или копируются и содержание которых выводится на экран, особенно подходят для создания классов данных.

    Тем не менее для классов данных существует ряд ограничений. Классы данных:

    Если вашему классу не требуются функции toString(), copy(), equals() или harsCode(), тогда его объявление как класса данных не даст никаких преимуществ. Если вам нужна своя реализация equals(), использующая только определенные свойства для сравнения, а не все, классы данных вам не подойдут, потому что они включают все свойства в автоматически сгенерированную функцию equals().

    Вы узнаете о переопределении equals() и других функций в своих типах позже в шаге, посвященном перегрузке операторов, а о быстром методе, предоставляемым IntelliJ, для переопределения equals() - в шаге, посвященном алгебраическим типам данных.

    На следующем шаге мы рассмотрим перечисления.




Предыдущий шаг Содержание Следующий шаг