Kotlin数据类可以有多个构造函数吗?

我知道数据类就像kotlin中的简单模型,默认情况下是getter和setter,它们就像这样简单:

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

是否可以声明该数据类的第二个构造函数?

是的,但每个变量都应该初始化,所以你可以在你的数据类构造函数中设置默认参数,如下所示:

 data class Person(val age: Int, val name: String = "Person without name") 

现在你可以用两种方法创建这个数据类的实例

  • Person(30)
  • Person(20, "Bob")

Kotlin数据类必须具有至少定义一个成员的主构造函数。 除此之外,您可以添加辅助构造函数,如类和继承 – 辅助构造函数中所述 。

对于你的类,以及示例二级构造函数:

 data class User(val name: String, val age: Int) { constructor(name: String): this(name, -1) { ... } } 

请注意,辅助构造函数必须在其定义中委托给主构造函数。

虽然许多次要构造函数通用的东西可以通过具有参数的默认值来解决。 在上面的情况下,你可以简化为:

 data class User(val name: String, val age: Int = -1) 

如果从Java中调用这些函数 ,则应该阅读关于如何生成重载的Java互操作Java调用Kotlin文档,有时也可以阅读其他特殊情况下的NoArg编译器插件 。

更新数据类的答案:

是的,你可以,但你将需要委托一切的主要构造函数

 data class User(val name: String, val age: Int) { constructor(name: String): this(name, -1) { } constructor(age: Int): this("Anon", age) { } } // Anon name: Anon println("Anon name: " + User(30).name) // No age: -1 println("No age: " + User("Name").age) // Name: Name age: 20 val u = User("Name", 20) println("Name: " + u.name + " age: " + u.age) 

您也可以像Alexey那样在主构造器中设置默认值。

是的,我们可以使用像下面的代码,而在数据类的主要构造函数应该有最小的一个参数。

 data class SampleData(val name: String, val age: Int) { constructor(name: String, age: Int, email: String) : this(name, age) { } }