Не знаю, куда писать- пишу сюда :slightly_smiling_...
# russian
a
Не знаю, куда писать- пишу сюда 🙂 Есть data-class, который хранит некоторые данные и timestamp (время, когда данные были получены). Т.к. эти данные хранятся в БД (андроида) и передаются через сеть (kotlin-serialization), так что timestamp надо хранить. При этом для сравнения его использовать не надо. Сейчас я сделал в каждом классе equals/hashCode без этого поля. Но это плохо, т.к. когда-нибудь можем добавить поле, а в equals добавить забудем. Можно ли просто исключить поле из equals/hashCode и при этом не сломать Serializable?
a
Нет. Лучше тогда не делать data class.
Тем более, что equals/hashcode генерируется идеей в одно касание
a
И каждый раза перегенерировать и удалять timestamp. А почему не использовать data class? Там хотя бы toString есть.
a
Ну дата класс имеет зашитую конкретную логику, там нельзя настраивать представление полей. Как вариант - можно сделать внутренний класс без таймстампа, а поверх него обертку с внутренникм классом и таймстампом
b
можно просто убрать timestamp из конструктора, тогда он не будет фигурировать в hashcode/equals
a
Кстати да. Это я не сообразил
b
Copy code
data class Foo(val bar: Int) {
    var timestamp: Long = 0
}
из минусов -теряется иммутабельность (этой проперти) -теряется copy (для этой проперти)
i
@bezrukov там еще атомарность теряется. потому что конструктор атомарен. а конструктор + запись в это поле - не
a
Ну можно внешний конструктор сделать
a
@bezrukov а kotlinx.serialization не потеряет это поле?
a
нет. Оно вообще по другому принципу работает. Главное чтобы там реальное поле с филдом было
a
Да, работает. Забавно. Причём даже
val x=10
будет корректно десерализовано из строки
..."x":15
в значение 15 🤯
Хотя так делать нельзя. Когда в коде стоит поле (не в конструкторе) вида
val x=10
а там внезапно оказывается 20 - это может взорвать мозг тому программисту, кто будет потом это читать. Лучше написать лишний код - не так красиво, но зато правильно.
b
@Iaroslav Postovalov конструктор не совсем атомарен (гребаный слак, неудобная фигня)
i
@Bogdan уел. видимо, там промежуточный конструктор java.lang.Object, потом целевой класс