当我设计不可变对象时,由于自动生成的copy
方法,案例类非常方便。
但是案例类有它们自己的问题:它们不应该继承而且即使你不想要它们也会给你一个提取器。
所以有时我必须使用花园式的Scala类。问题是,我必须编写自己的不可变API,这可能非常重复:
class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
def withNewPrincipalBalance(bal: Double) = new Debt(bal, name, endDate)
}
有更可扩展的方法吗?是否有可以使用的编译器插件?
答案 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
)的单独方法那样重复,并且可以禁止更改某些值(例如创建日期)。