+ Лист с объектами. Данные объекты могут быть А, B, C, D, E типов. У данных типов есть несколько ОБЩИЙ полей(id, type), НО есть и уникальные для каждого типа поля. По TYPE можно понять, что это за тип.
Использую retrofit.
Для приема есть объект и в нём лист с базовым классом(у которого 2 поля id & type):
class GetListResponse(success: Boolean,
@Field("m_list") val list: List<BaseMyTypeResponse>)
Предположим всё пришло и мы имеем лист базового типа объектов.
Далее мне нужно:
а) понять какой объект какого типа. Это делаем по полю type
б) скастить данный объект в нужный тип. И вот тут вопросы:
1) данные типы(A, B, C, D) - должны быть просто data(ну как вариант)?
Я стал создавать классы по типу базового, унаследованные от него, типа:
class MyATypeResponse(id: String, type: String, uniq_filed:String: BaseMyTypeResponse(id, type)
Но потом подумал, что это кажется не верный путь и нужно создавать уже именно data классы и в них кастить.
Верно ли я думаю?
2) как лучше кастить в данном случае?
Спасибо!
data class нужен тогда, когда он нужен -- если нужны equals + hashCode, объекты будут деструктуризироваться и т.п. Подумайте, есть ли у вас такая необходимость. Если у вас есть пачка классов с одинаковыми полями и нужно кастоваться с учётом этого, логично предположить, что у вас есть иерархия типов с конечным количеством наследников. Это как раз то, о чём sealed классы. Опишите базовый тип с парой полей, наследников с остальными. Единственное -- для ретрофита надо написать конвертер, который решит проблему с парсингом JSON не в конкретный тип, а в один из его наследников в зависимости от содержимого. Но когда я последний раз смотрел, в сети были подсказки, как это сделать.
Обсуждают сегодня