转换Scala案例类中的更新值(例如覆盖setter)

时间:2012-10-05 16:20:06

标签: scala

假设我有一个Scala案例类,如下所示:

case class Item(
  roundedValue: Double = 0.00)

我想在每次更新变量时对roundedValue执行以下舍入操作:

roundedValue = math.round(roundedValue*100)*0.01

在其他语言中,我只是覆盖roundValue的setter,但似乎我不能覆盖case类变量的setter,否则它将无法编译。

我看到的一个解决方案是将roundedValue重命名为_roundedValue并将其设为私有,然后添加公共方法来模拟getter和setter(使用舍入逻辑):Overriding setter on var

然而,当使用命名参数时,这使得构造函数的使用对于case类非常尴尬。有没有其他方法可以做到这一点,或者这是Scala案例类的限制?

1 个答案:

答案 0 :(得分:1)

如果你可以使它工作,我建议保持你的案例类不可变,但是制作一个“复制”方法,在新实例上进行突变。

case class Item(roundedValue: Double = 0.0) {
  def withValue(newValue: Double) = Item(math.round(newValue*100)*0.01)
}

您可能/也希望在随播对象中使用类似的方法:

object Item {
  def withValue(value: Double) = Item(math.round(roundedValue*100)*0.01)
}