为什么在数据类中初始化变量

时间:2020-06-18 01:57:44

标签: android kotlin

根据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上,如果生成的类需要具有无参数构造函数,则必须指定所有属性的默认值

我不明白,不同方法的含义是什么

第二,编写包含复杂对象变量(例如ArrayListBitmapUri

的数据类的最佳方法是什么?

1 个答案:

答案 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)
}

您的第二个问题是开放性和基于观点的,因此几乎不可能以有用的方式回答。