使用不可变属性更改 Kotlin 中对象的状态

Joh*_*eer 4 kotlin

在 Kotlin 中,我们有不可变属性的概念。

我曾经听说在函数式编程中,状态不应该改变。我一直在域模型的上下文中考虑这个问题。

假设我们有一个Person类(请不要介意这个非常愚蠢和不切实际的例子)。

class Person(val firstName: String, val lastName: String, val age: Int)
Run Code Online (Sandbox Code Playgroud)

所有属性都是不可变的,这很好。

现在有人过来要求更换名字。所以我创建了一个可以做到这一点的函数。

fun replaceFirstName(person: Person, newFirstName: String): Person {
    return Person(newFirstName, person.lastName, person.age)
}
Run Code Online (Sandbox Code Playgroud)

现在这在我看来真的很难看。在这种情况下,只有 3 个属性,其中一个应该被替换。但是您可能可以想象这在更大的域类中会是什么样子。

简单的事情就是val用 a替换var,但是不变性的整个意图就消失了。

我正在寻找这样的东西(它确实抛出了一个错误,因为没有复制功能):

fun replaceName(person: Person, newFirstName: String): Person {
    return person.copy { firstName = newFirstName }
}
Run Code Online (Sandbox Code Playgroud)

在 Kotlin 中是否有一种简洁明了的方法来做到这一点?

nok*_*ula 5

Kotlin 有一个Data classes的概念,它有copy你需要的功能。因此,如果您将类声明为:

data class Person(val firstName:String, val lastName:String, val age:Int)
Run Code Online (Sandbox Code Playgroud)

您将能够使用此功能。它也会equals()/hashCode/toString()为你生成。