Котлин: Почему @Parcelize требует, чтобы все сериализованные свойства были объявлены в основном конструкторе? - PullRequest
0 голосов
/ 31 октября 2018

Во многих сценариях мне не нужно передавать поле из основного конструктора, например, поле назначается после инициализации и были предприняты некоторые шаги; поле напрямую обращается к глобальной переменной (такой как статические переменные, такие как другие постоянные данные).

Теперь у меня есть компромиссное решение - использовать var и default value в основном конструкторе или переопределить все методы сериализации в companion object: Parceler <Model>, оба из которых имеют недостатки.

Почему Котлин так устроен? Есть ли лучшее решение?

1 Ответ

0 голосов
/ 31 октября 2018

Потому что так работает сериализация. Например, у вас есть

data class User(val name: String, val id: Int)

val user = User("foo", 1)

и сериализуется в JSON (@Parcelize не сериализуется в JSON. Это пример.)

{
  "name": "foo",
  "id": 1
}

Когда он десериализует JSON, ему необходимо создать обратно объект из JSON выше. Без основного конструктора, который имеет все необходимые поля, он не может создать один и тот же объект.

Если у вас сложный объект, вы можете создать отдельный класс для сериализации и создать фабричный метод для принятия этого класса.

Или вы можете реализовать Parcelable самостоятельно и понять, зачем вам нужны все поля в конструкторе.

...