当我设计不可变对象(immutable对象)时,由于自动生成的copy
方法,案例类非常方便。
但是case类有其自身的问题:不应继承它们,并且即使您不想要它们,它们也会为您提供提取器。
因此有时我必须使用多种花园的Scala类。问题在于,然后我必须编写自己的不可变API,该API可能会非常重复:
class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
def withNewPrincipalBalance(bal: Double) = new Debt(bal, name, endDate)
}
有没有更可扩展的方法来做到这一点?我可以使用一个编译器插件吗?
最佳答案
我不了解编译器插件,但是您可以定义copy
方法,就像在case类中使用命名参数和默认参数组合生成的方法一样。
class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
def copy(principalBalance: Double = principalBalance,
name: String = name,
endDate: LocalDate = endDate) = new Debt(principalBalance, name, endDate)
}
这不像每个属性(
withNewPrincipalBalance
)的单独方法那样重复,并且可以禁止某些值(例如,创建日期)的更改。关于scala - 非案例类的“副本”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6637283/