"复制"非案例类?

Bil*_*ill 21 scala

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

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

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

class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
  def withNewPrincipalBalance(bal: Double) = new Debt(bal, name, endDate)
}
Run Code Online (Sandbox Code Playgroud)

是否有更可扩展的方法来做到这一点?我可以使用编译器插件吗?

kas*_*ens 35

我不知道编译器插件,但您可以定义一个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)
}
Run Code Online (Sandbox Code Playgroud)

这不像每个property(withNewPrincipalBalance)的单独方法那样重复,并且可以禁止更改某些值(例如创建日期).