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

标签 kotlin

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

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

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

class Person(val firstName: String, val lastName: String, val age: Int)

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

现在有人过来要求更换名字。所以我创建了一个可以做到这一点的函数。
fun replaceFirstName(person: Person, newFirstName: String): Person {
    return Person(newFirstName, person.lastName, person.age)
}

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

简单的事情就是更换 valvar ,但随后不变性的整个意图就消失了。

我正在寻找这样的东西(它确实抛出了一个错误,因为没有复制功能):
fun replaceName(person: Person, newFirstName: String): Person {
    return person.copy { firstName = newFirstName }
}

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

最佳答案

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

data class Person(val firstName:String, val lastName:String, val age:Int)

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

关于kotlin - 使用不可变属性在 Kotlin 中更改对象的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50923333/

相关文章:

kotlin - LiveData 总是返回 LiveData<Object>?

android-studio - Kotlin中 Unresolved reference 错误(bottom_navigation.setOnNavigationItemSelectedListener)

android - 使用实时数据时如何在 Android 中链接转换?

spring-boot - JPA 自动完成在 Intellij spring-boot kotlin 项目中不起作用

spring - 我无法在 Springboot-Kotlin 中排除 MongoAutoConfiguration (MongoSocketOpenException)

kotlin - 如何使用 spqr 从查询根节点中排除突变?

Spring Boot @Autowired 自定义 application.properties

安卓10 : No custom sound in notification

kotlin - requireNotNull 与确定运算符 !!在 Kotlin

java - 在 Kotlin 中定义 log TAG 常量的最佳方法是什么?