我的代码中有一个奇怪的东西,无法找出原因。也许这是我不知道的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>
由于
答案 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))
}
}
上试用
答案 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
方法更干净,不必修改案例类。