在许多情况下,我不需要从主构造函数传递一个字段,例如,初始化后已分配了一个字段,并已采取了一些步骤。字段直接访问全局变量(例如静态变量,例如其他持久性数据)。
现在,我有一个折衷的解决方案是在主要构造函数中使用var
和default value
,或者覆盖companion object: Parceler <Model>
中的所有序列化方法,这两种方法都有缺点。
为什么Kotlin设计成这样? 有更好的解决方案吗?
答案 0 :(得分:1)
因为这就是序列化的工作方式。例如,您有
data class User(val name: String, val id: Int)
val user = User("foo", 1)
,并且它序列化为JSON(@Parcelize
不序列化为JSON。这是一个示例。)
{
"name": "foo",
"id": 1
}
反序列化JSON时,需要从上面的JSON重新创建对象。如果没有具有所有必填字段的主构造函数,它将无法创建相同的对象。
如果您有一个复杂的对象,则可以创建一个单独的类进行序列化,并创建一个工厂方法来接受该类。
或者您也可以自己实现Parcelable
,并且可以看到为什么需要构造函数中的所有字段。