Scala案例类。私有var未初始化

时间:2015-12-16 08:48:01

标签: scala case-class

我的代码中有一个奇怪的东西,无法找出原因。也许这是我不知道的Scala功能。

case class Page(index:Int) {
  private var lines = Map[Int, Line]()

  def set(index:Int, line:Line):Page = {
    val copy = this.copy()
    copy.lines = this.lines + (index -> line) // <-- My problem
    copy
  }
}

我的问题是,行copy.lines = this.lines + (index -> line)引发 NullPointerException ,因为this.lines为空。但是copy.lines不为空。

您是否知道为什么在复制lines时初始化Page地图,而不是在我创建新地图时?{/ p>

由于

2 个答案:

答案 0 :(得分:4)

尝试用不可变变量

替换lines变量
case class Page(index:Int, lines: Map[Int, Line] = Map()) {
    def set(index:Int, line:Line): Page = {
        copy(lines = lines ++ Map(index -> line))
    }
}

您可以在http://www.scalakata.com/

上试用

答案 1 :(得分:0)

所以,

问题是由于我的persitence层。我正在使用的系统使用java bean约定,因此忽略了private var lines。然后,当我恢复Page时,它会将其设置为null ..

其中一个解决方案,因为我忘记了我们可以在案例类中使用private val来创建另一个公开lines并在我的持久层中映射/取消映射它的类。

希望@Rovak提醒我,我也可以做case classs Page(index: Int, private val lines:Map[Int, Line]=Map())。这样我就可以删除所有那些丑陋的映射线,并以更清晰的方式获益。另一个优点是set方法更干净,不必修改案例类。