Программа напечатает true и true. Сгенерированный equals класса Animal сравнивает name из первичного конструктора, но не voice из тела класса.
Что выведет сравнение экземпляров data‑класса
Программа напечатает 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.