当我设计不可变对象(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/

10-16 02:33