根据official doc,这是声明data class
的方式
data class User(val name: String, val age: Int)
但是在大多数情况下,我看到这样声明了数据类,
data class User(var username: String? = "", var email: String? = "", var age: Int = 0)
文档说明:在JVM上,如果生成的类需要具有无参数构造函数,则必须指定所有属性的默认值
我不明白,不同方法的含义是什么
第二,编写包含复杂对象变量(例如ArrayList
,Bitmap
,Uri
答案 0 :(得分:3)
仅当您将类与某些通过反射生成类实例的库一起使用时(例如,序列化库或依赖项注入库),无参数构造函数才可能是必需的。
如果将=
和一些值放在构造函数参数之后,则可以在调用构造函数时忽略该参数。省略该参数时,您输入的值将是默认值。通常这是为了方便。但是,如果您正在使用上述库之一,则还需要一个空的构造函数。通过为每个参数提供默认值并用@JvmOverloads
注释主要构造函数,您可以满足此要求。看起来像这样:
data class User @JvmOverloads constructor(var username: String? = "", var email: String? = "", var age: Int = 0)
如果数据类具有很多属性,则可能不希望使用@JvmOverloads
,因为它生成的构造函数的数量与默认属性的数量成指数比例。相反,您可以这样定义一个辅助构造函数:
data class User(var username: String?, var email: String?, var age: Int) {
constructor(): this("", "", 0)
}
您的第二个问题是开放性和基于观点的,因此几乎不可能以有用的方式回答。