从Kotlin开始,想创建一个数据类
data class Person(val Email: String, val firstName: String, val lastName: String)
但是,假设我要添加在我使用构造函数时不知道的其他属性,但是我想在以后知道诸如人的心情(例如,表示为字符串)
在Java中,我将创建这样的数据类。我将无法将其包含在构造函数中,并在以后可以设置它的地方做一个吸气剂。
public class Person{
private String email;
private String firstName;
private String lastName;
private String mood;
public person (String email, String firstName, String lastName){
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
}
public setMood(String mood){
this.mood = mood;
}
}
科特琳似乎没有对此的答案,或者如果我没有答案,我将不知道该如何正确说词。因此,为什么这个问题已经可以回答,而我却找不到。
我确实知道,通过不在数据类行中包含情绪,Kotlin可能无法将情绪识别为数据类的一部分,但除了将其包含在构造函数中并将其设置为null之外,我不确定该做的还是应该做的?
答案 0 :(得分:6)
您应该可以将其作为属性添加到Person
中。在Kotlin中,数据类仍然是一个类,它只是带有一些附加功能(toString,副本构造函数,hashCode /等号等)。您仍然可以定义所需的任何属性。
data class Person(val Email: String, val firstName: String, val lastName: String) {
var mood: String? = null
}
在这种情况下,它是可以为空的,因为正如您所说,您可能直到以后才知道心情。
答案 1 :(得分:2)
Kotlin的数据类必须具有第一个构造函数,可以通过不使用data
关键字来避免使用它。
如果您仍想向数据类添加另一个属性,则可以执行以下操作:
data class Person(val email: String, val firstName: String, val lastName: String){
var mood: String = ""
}
这样,您可以执行person.mood = "happy"
而无需将其包含在构造函数中。
答案 2 :(得分:2)
Kotlin仅考虑传递给主构造函数的值,以便为您提供Data类提供的“免费”功能。除此之外,您可以添加所需的任何其他属性,但是Kotlin通过将类标记为data
编写的特殊代码中没有考虑这些属性。
根据Kotlin文档:
请注意,编译器仅使用内部定义的属性。 自动生成的函数的主要构造函数。至 从生成的实现中排除属性,然后对其进行声明 在课程正文中:
因此,在主构造函数之外声明属性实际上是有好处的。您也许可以通过主构造函数声明属性,但选择不声明。
不仅必须提供一个主构造函数,而且还必须至少包含一个属性声明。如果您不这样做,则将该类设为data
类将没有任何好处。但是,标记一个类并不限制您可以对该类进行其他操作。
答案 3 :(得分:2)
您尝试过吗:
data class Person(val Email: String, val firstName: String, val lastName: String) {
var mood: String? = null
}
答案 4 :(得分:0)
@Todd和@jingx的答案的替代方法是
data class Person(val Email: String, val firstName: String, val lastName: String, var mood: String? = null)
区别在于,mood
以这种方式参与toString
/ equals
/ hashCode
/ copy
,而您可以在构造函数调用中设置mood
。即使在这种特定情况下可能不希望这样做,在其他情况下也可能有用。