https://kotlinlang.org logo
#russian
Title
# russian
a

aleksey.tomin

10/23/2020, 2:11 PM
Не знаю, куда писать- пишу сюда 🙂 Есть data-class, который хранит некоторые данные и timestamp (время, когда данные были получены). Т.к. эти данные хранятся в БД (андроида) и передаются через сеть (kotlin-serialization), так что timestamp надо хранить. При этом для сравнения его использовать не надо. Сейчас я сделал в каждом классе equals/hashCode без этого поля. Но это плохо, т.к. когда-нибудь можем добавить поле, а в equals добавить забудем. Можно ли просто исключить поле из equals/hashCode и при этом не сломать Serializable?
a

altavir

10/23/2020, 2:18 PM
Нет. Лучше тогда не делать data class.
Тем более, что equals/hashcode генерируется идеей в одно касание
a

aleksey.tomin

10/23/2020, 2:19 PM
И каждый раза перегенерировать и удалять timestamp. А почему не использовать data class? Там хотя бы toString есть.
a

altavir

10/23/2020, 2:20 PM
Ну дата класс имеет зашитую конкретную логику, там нельзя настраивать представление полей. Как вариант - можно сделать внутренний класс без таймстампа, а поверх него обертку с внутренникм классом и таймстампом
b

bezrukov

10/23/2020, 2:28 PM
можно просто убрать timestamp из конструктора, тогда он не будет фигурировать в hashcode/equals
a

altavir

10/23/2020, 2:28 PM
Кстати да. Это я не сообразил
b

bezrukov

10/23/2020, 2:28 PM
Copy code
data class Foo(val bar: Int) {
    var timestamp: Long = 0
}
из минусов -теряется иммутабельность (этой проперти) -теряется copy (для этой проперти)
i

Iaroslav Postovalov

10/23/2020, 2:34 PM
@bezrukov там еще атомарность теряется. потому что конструктор атомарен. а конструктор + запись в это поле - не
a

altavir

10/23/2020, 2:35 PM
Ну можно внешний конструктор сделать
a

aleksey.tomin

10/23/2020, 4:51 PM
@bezrukov а kotlinx.serialization не потеряет это поле?
a

altavir

10/23/2020, 4:52 PM
нет. Оно вообще по другому принципу работает. Главное чтобы там реальное поле с филдом было
a

aleksey.tomin

10/23/2020, 5:57 PM
Да, работает. Забавно. Причём даже
val x=10
будет корректно десерализовано из строки
..."x":15
в значение 15 🤯
Хотя так делать нельзя. Когда в коде стоит поле (не в конструкторе) вида
val x=10
а там внезапно оказывается 20 - это может взорвать мозг тому программисту, кто будет потом это читать. Лучше написать лишний код - не так красиво, но зато правильно.
b

Bogdan

10/27/2020, 4:37 PM
@Iaroslav Postovalov конструктор не совсем атомарен (гребаный слак, неудобная фигня)
i

Iaroslav Postovalov

10/27/2020, 8:06 PM
@Bogdan уел. видимо, там промежуточный конструктор java.lang.Object, потом целевой класс
4 Views