Что выведет сравнение экземпляров data‑класса

Программа напечатает true и true. Сгенерированный equals класса Animal сравнивает name из первичного конструктора, но не voice из тела класса.

Короткий ответ

Что ответить на собеседовании

Программа напечатает true и true. Сгенерированный equals класса Animal сравнивает name из первичного конструктора, но не voice из тела класса.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой вывод появится в консоли после запуска приведённого ниже кода.

data class Animal(val name: String) {
    var voice: String? = null
}

fun main() {
    val animal1 = Animal("cat")
    val animal2 = Animal("cat")
    println(animal1 == animal2)
    animal1.voice = "meow"
    animal2.voice = "woof"
    println(animal1 == animal2)
}

Ответ

Программа напечатает true и true. Сгенерированный equals класса Animal сравнивает name из первичного конструктора, но не voice из тела класса.

Сначала name одинаков у обоих объектов; последующие meow и woof меняют свойство, которое не участвует в равенстве. Для сравнения идентичности экземпляров используется ===, и здесь оно даст false. Если voice — часть идентичности значения, его нужно включить в конструктор или переопределить equals и hashCode.

Источник: kotlinlang.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее