如何在scala的case类中添加自定义行为来复制函数?

时间:2014-09-01 08:00:24

标签: function scala copy case-class

是否可以在案例类中添加自定义行为来复制函数?

这样的事情:

case class User (version: Integer) { //other fields are omitted
    //something like this
    override def copy (...) {
        return copy(version = version + 1, ...)
    }
}

所以我不想重写复制功能,只需添加增加版本字段并复制其他字段。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

向基本功能(如复制)添加行为不是一个好主意。功能方法是让数据只是数据,并在从外部操作数据的函数中具有行为。

但如果你真的想这样做,你只需要重新实现复制方法,如下所示:

case class User(name:String, age:Int, version:Int = 0) {
  def copy(name:String = this.name, age:Int = this.age) = User(name,age,version+1)
}

用法:

scala> User("John Doe", 25).copy(age = 26)
res4: User = User(John Doe,26,1)    

但请注意,您可能必须重新实现其他一些方法以及有用的行为。例如,您可能不希望人们在构造用户时能够传递版本。因此,您需要将构造函数设为私有并添加apply方法。

您也可能不希望将版本字段视为相等。所以你必须重新定义equals和hashCode以省略version字段。因此,由于您已经重新定义了案例类为您提供的几乎所有内容,因此您也可以使该类成为普通的非案例类。

一般来说,我认为案例类应该用于纯数据,而更多面向对象的类混合数据和逻辑最好是作为普通类完成,即使它意味着更多的输入。