Освой Kotlin играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

data

Если у класса указать ключевое слово data, то автоматически будут созданы методы toString(), equals(), hashCode(), copy(). Скорее всего вы будете использовать этот вариант для создания полноценного класса-модели с геттерами и сеттерами.


data class Client(val name: String, val postalCode: Int)

Например, подобные классы часто используются при работе с JSON.

toString()

Если нужно получить информацию о классе, то достаточно вызвать имя переменной класса. Вы получите информацию на основе конструктора вместо непонятных символов @Cat5edea как в Java. Такой подход удобен при тестировании и отладке. Сразу понятно, о чём идёт речь.


data class Cat(var name: String, var age: Int)

val cat = Cat("Murzik", 7)
println(cat) // Cat(name=Murzik, age=7)

Деструктурирующее присваивание

Любопытный способ разбить объект на несколько переменных.


data class Cat(var name: String, var age: Int, var city: String)

val cat = Cat("Murzik", 7, "Moscow")
// три переменных в одном месте
val (catName, catAge, place) = cat
println(catName)
println(catAge)
println(place)

Можно пропустить какую-то переменную через символ подчёркивания.


val (catName, _, place) = cat

Несколько конструкторов

Добавить второй конструктор к классу можно через ключевое слово constructor.


data class Cat(val name: String) {
    var age = 0;

    constructor(name: String, age: Int) : this(name) {
        this.age = age;
    }
}

Есть другой способ через аннотацию.


data class Cat @JvmOverloads constructor(val name: String, val age: Int? = 0) {

}

При создании data-классов компилятор автоматически добавляет набор функций, с помощью которых можно обратиться к свойствам. Они известны как componentN-функции, где N - это номер свойства. Подсчёт номера идёт по порядку в объявлении класса.


data class Music(val title: String, val author: String)

// Обращаемся к классу
val music = Music("Kalinka", "Abba")
val title = music.component1()
val author = music.component2()
println("$title $author")

Мы могли бы обратиться и привычным способом.


val title = music.title
val author = music.author
println("$title $author")
Реклама