“复制”非案例类?

时间:2011-07-09 20:23:20

标签: scala

当我设计不可变对象时,由于自动生成的copy方法,案例类非常方便。

但是案例类有它们自己的问题:它们不应该继承而且即使你不想要它们也会给你一个提取器。

所以有时我必须使用花园式的Scala类。问题是,我必须编写自己的不可变API,这可能非常重复:

class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
  def withNewPrincipalBalance(bal: Double) = new Debt(bal, name, endDate)
}

有更可扩展的方法吗?是否有可以使用的编译器插件?

1 个答案:

答案 0 :(得分:34)

我不知道编译器插件,但你可以定义一个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)的单独方法那样重复,并且可以禁止更改某些值(例如创建日期)。