scala不可变类vals setters

时间:2016-05-26 18:41:58

标签: scala class constructor immutability setter

Scala中是否存在一些语法糖,以及#34;不可变的类设置器"?

以下是一个例子:

class Bob (val x:Int, val y:String)

为了更改xy,我可以这样实现:

object Bob {
    def updX (b:Bob) (x:Int) = new Bob (x, b.y)
    def updY (b:Bob) (y:String) = new Bob (b.x, y)
}
class Bob (val x:Int, val y:String) {
    def updX (x:Int) = Bob.updX(this)(x)
    def updY (y:String) = Bob.updY(this)(y)
}

这个解决方案很糟糕,因为我的一些类有8个参数。

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:5)

如果你把你的班级作为案例类,你将免费获得一个复制方法。 Case类参数是自动不可变的,因此不需要在它们前面放置val。

case class Bob(x: Int, y: String)

val bob1 = Bob(1, "Bob1")
val bob2 = bob1.copy(y = "Bob2")

答案 1 :(得分:0)

正如@ {insin-e在his answer中提到的,案例类使用的模式是copy方法,其参数与构造函数匹配,默认值与val匹配。您可以自己轻松实现:

class Bob(val x: Int, val y: String) {
  def copy(x: Int = x, y: String = y) = new Bob(x, y)
}