Comments 13
Прочел статью. Понял, что все и в правду вошло в привычку, не представляю, как будут смотреть ребята pull request, когда я вместо object для перехода на другой экран, пропишу class, посмотрят как на чокнутого, но опять data object и предполагает под себя единый класс, который передает какой то state в effect
Возможно, ссылка на мой текст может послужить аргументом для использования. Моё видео про вред lateinit пошло в массы и я уже слышал: "Так не стоит делать, потому что в своём видео Кирилл запретил!" 😁
К чему это вообще? Синдром блогера (типо шарю)?
В моём коде я описываю логику отправки события, которое каждое является уникальным и точно не подходит под описание "один экземпляр на всё приложение". Будь у моего класса хотя бы один параметр в primary конструкторе, то такого предупреждения от IDE с "полезным" советом я не получил.
Проблема не в IDE а в том что Вы нигде и никак кроме как в словей голове не обозначили что экземпляры данного класса должны быть уникальными и надеетесь на identityhashcode вместо того чтобы явно выделить это свойство класса. IDE в данном случае вполне права - либо делайте синглтоном либо явно прописывайте те свойство что сделают объекты этого класса уникальными.
Что-то из моего примера вам покажется оверинженирингом, ведь с проблемой вы не стоклнулись. Буду рад в комментариях услышать ваше мнение касательно моих предложений и другого синтаксического сахара Kotlin, который может идти во вред.
Есть такие предложения, использования повсеместно дата классов и упование на магию R8.
Обратную совместимость можно починить через Companion object, если это необходимо
sealed interface UiEvent {
data class ConfirmClicked(
val id: String
) : UiEvent
companion object {
val ConfirmClicked = ConfirmClicked("default-id")
}
}
Так а в чём именно проблема-то?
События они же и есть данные - какая разница, будет ли приложение каждый раз создавать новый объект, или гонять туда-сюда один и тот же.
Если не использовать ===
то это должно быть ненаблюдаемо.
Вы же не пытаетесь сравнивать собития на равенство, да? (за исключением тестов).
Проблема с обратной совместимостью кажется надуманной: если у нас появились данные в событии - то разумно пробежаться по местам использования и предоставить там эти данные.
Передумал
Согласен с тем что data класс/object генерит слишком много кода. И для обычного эвента ту мач. В связке Object или Class без uid с shared flow работает норм. Правда может быть дабл клик. Хотя, использование uid, как у автора, не спасет от дабл клика даже при использовании LiveData или StateFlow, так как от ui будет всегда приходить новый объект с новым uid. А если будет статичны uid то будет работать только с SharedFlow но дабл клик остаться.
На счет тестов, можно сверять ссылки на объект. Тогда точно можно сказать, что объект тот же самый, а не вновь созданный с тем же uid.
Отсюда вопрос зачем тогда нужен random uid?
Думаю вполне можно использовать обычные классы или обьекты. Дата классы если прям реально используется сравнение где-то. Наподобии diffUtil или stateFlow.
Но в реальности data классы повсеместно по поводу и без везде используют и иногда со всеми и я. Хотя стараюсь думать сначала ))
Как синтаксический сахар Kotlin может сломать вам логику работы приложения