使用 Kotlin 数据类时如何添加非构造函数参数

5

如果你刚开始学习Kotlin并想创建一个数据类,可以按照以下步骤操作:

data class Person(val Email: String, val firstName: String, val lastName: String)

但是假设我想添加一些额外的属性,而当我使用构造函数时我并不知道这些属性,但我想在稍后知道这些属性,例如一个人的心情(表示为字符串)。

在Java中,我会创建一个数据类。我可以不在构造函数中包含它,并创建一个getter,在稍后设置它。

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似乎没有一个确切的答案,如果有的话,我不知道如何正确表达。因此,这个问题可能已经被回答了,但我无法找到。

我明白,通过在数据类行中不包括心情,Kotlin可能无法将其识别为数据类的一部分,但是除了在构造函数中包含它并将其设置为null之外,我不确定还应该做什么或者这是否是我应该做的事情?

5个回答

12

您只需将其作为Person的属性添加即可。在 Kotlin 中,数据类仍然是一个类,只不过它具有一些额外功能(如toString、复制构造函数、hashCode/equals等)。您仍然可以定义任何想要的属性。

data class Person(val Email: String, val firstName: String, val lastName: String) {
    var mood: String? = null
}
在这种情况下,它是可为空的,因为正如您所述,直到后来您可能才知道心情。

3
Kotlin仅考虑传递给主构造函数的值,以便为您提供数据类提供的“免费”功能。除此之外,您可以添加任何其他属性,但在Kotlin通过将类标记为的方式编写特殊代码时,它们不会被考虑在内。
根据Kotlin文档: 注意编译器只使用主构造函数中定义的属性来生成自动化函数。 要从生成的实现中排除某个属性,请在类体内声明它:
因此,在主构造函数之外声明属性实际上有好处。您可能能够通过主构造函数声明属性,但选择不这样做。
您不仅必须提供一个主构造函数,而且它必须包含至少一个属性声明。如果没有这样做,将其标记为类就没有任何好处。但是,将类标记为不限制您对该类的其他操作。

3

Kotlin的数据类必须有第一个构造函数,如果不使用data关键字,则可以避免这种情况。

如果仍要向数据类添加另一个属性,则可执行以下操作:

data class Person(val email: String, val firstName: String, val lastName: String){
    var mood: String = ""
}

通过这种方式,您可以在不将其包含在构造函数中的情况下执行 person.mood = "happy"


2
你尝试过以下方法吗:

最初的回答:

data class Person(val Email: String, val firstName: String, val lastName: String) {
    var mood: String? = null
}

2
@Todd和@jingx的答案之外,另一个选择是"最初的回答"。
data class Person(val Email: String, val firstName: String, val lastName: String, var mood: String? = null)

区别在于这种方式中,mood参与了toString/equals/hashCode/copy,而且你可以在构造函数调用中设置mood。即使对于这种特定情况可能不是理想的,但在其他情况下可能会很有用。"Original Answer"翻译成"最初的回答"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接