Как работает equals() в Data Class

Ответ

В Kotlin data class автоматически генерирует equals(), который сравнивает все свойства, объявленные в первичном конструкторе.

data class User(val name: String, val age: Int)

val user1 = User("Alex", 25)
val user2 = User("Alex", 25)
println(user1 == user2) // true - свойства одинаковые

Ключевые особенности:

  1. Сравниваются только свойства из конструктора (не var/val в теле класса)
  2. Null-значения обрабатываются корректно
  3. Для массива используется contentEquals(), а не ==
  4. Генерированный метод соответствует контракту equals() (рефлексивность, симметричность и т.д.)

Для кастомного сравнения нужно переопределить equals() вручную.

Ответ 18+ 🔞

А, ну вот, классика, ебать мои старые костыли! Смотри, сейчас объясню про эти ваши data class в Kotlin, чтобы ты не пиздел потом, что не понял.

Вот представь, ты создал такую штуку:

data class User(val name: String, val age: Int)

val user1 = User("Alex", 25)
val user2 = User("Alex", 25)
println(user1 == user2) // true - свойства одинаковые

Видишь? Два разных объекта, но == вернёт true. Почему? Да потому что компилятор, хитрая жопа, сам для data class генерирует метод equals(), который тупо сравнивает ВСЕ свойства, которые ты объявил в первичном конструкторе. Не в теле класса, ёпта, а именно в конструкторе! Это важно, как отличить хуй от пальца.

Вот основные фишки, которые надо держать в голове, а то сам от себя охуеешь потом:

  1. Сравнивает только конструкторские свойства. Если у тебя внутри класса есть ещё какая-то var или val, но она не в скобочках конструктора — на неё всем похуй, в сравнении она участвовать не будет. Чисто конструктор.
  2. С null'ами не сломается. Если какое-то свойство может быть null, метод не вздрогнет, обработает нормально.
  3. С массивами — засада! Вот тут внимание, ёклмн! Для массивов (Array) используется не обычное сравнение ==, а contentEquals(). Если забудешь — будет тебе хиросима, а не сравнение.
  4. Всё по науке. Сгенерированный метод не какой-то левый, он соблюдает все эти ваши умные контракты: рефлексивность, симметричность, транзитивность. Не косячит, короче.

А если тебе это автоматическое сравнение не подходит, если тебе надо как-то по-хитрому, по-особенному? Ну тогда, чувак, всё, приехали. Берёшь и переопределяешь equals() вручную, как большой. Пишешь свою логику, и волнение ебать — компилятор тебе уже не помощник. Сам за всё отвечаешь.