tgoop.com/kotlin_lib/526
Create:
Last Update:
Last Update:
🧨 equals()
в Kotlin: незаметная ловушка, которая бьёт по бизнес-логике
Когда equals()
работает не так, как ты думаешь — начинается отладочный ад. Особенно, если ты используешь data class
и полагаешься на их auto-generated equals.
Представь кейс: ты получаешь DTO из API и кладёшь его в Set
, надеясь, что дубликаты не появятся. Но через минуту замечаешь, что одинаковые по сути объекты спокойно живут рядом. Почему?
📌 Типичная ошибка — включать в equals()/hashCode()
поля, которые не участвуют в "бизнесовой" идентичности объекта. Например:
data class Product(
val id: String,
val name: String,
val lastUpdated: Long // техническое поле
)
Добавь два продукта с одинаковым
id
, но разным lastUpdated
— и Set посчитает их разными.equals()
и hashCode()
, вручную указав, какие поля важны:
data class Product(
val id: String,
val name: String,
val lastUpdated: Long
) {
override fun equals(other: Any?) =
other is Product && other.id == id
override fun hashCode() = id.hashCode()
}
🔥 Если используешь
copy()
— помни, что он тащит все поля. И если ты потом сравниваешь объекты по equals()
, может случиться сюрприз.✅ Вывод: auto-generated
equals()
удобен, но не всегда безопасен. Если объект участвует в коллекциях, кэшах или логике сравнения — контролируй его равенство вручную.✍️ @kotlin_lib