具有附加属性的Kotlin数据类不在构造函数中

时间:2019-04-11 18:02:37

标签: kotlin data-class

从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之外,我不确定该做的还是应该做的?

5 个答案:

答案 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。即使在这种特定情况下可能不希望这样做,在其他情况下也可能有用。