KOTLIN_LIB Telegram 526
🧨 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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53



tgoop.com/kotlin_lib/526
Create:
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

BY Kotlin




Share with your friend now:
tgoop.com/kotlin_lib/526

View MORE
Open in Telegram


Telegram News

Date: |

To edit your name or bio, click the Menu icon and select “Manage Channel.” The Channel name and bio must be no more than 255 characters long 6How to manage your Telegram channel? A few years ago, you had to use a special bot to run a poll on Telegram. Now you can easily do that yourself in two clicks. Hit the Menu icon and select “Create Poll.” Write your question and add up to 10 options. Running polls is a powerful strategy for getting feedback from your audience. If you’re considering the possibility of modifying your channel in any way, be sure to ask your subscribers’ opinions first. On June 7, Perekopsky met with Brazilian President Jair Bolsonaro, an avid user of the platform. According to the firm's VP, the main subject of the meeting was "freedom of expression."
from us


Telegram Kotlin
FROM American