当我设计不可变对象时,由于自动生成的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
)的单独方法那样重复,并且可以禁止更改某些值(例如创建日期).
归档时间: |
|
查看次数: |
5680 次 |
最近记录: |