Scala案例类。私有变量未初始化

Scala案例类。私有变量未初始化,scala,case-class,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 c

我的代码中有一个奇怪的东西,无法找出原因。也许这是我不知道的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
  }
}
案例类页面(索引:Int){
私有变量行=映射[Int,Line]()
def集合(索引:Int,行:line):第页={
val copy=this.copy()
copy.lines=this.lines+(index->line)//line)
引发NullPointerException,因为
this.lines
为空。但是
copy.lines
不为空

您知道为什么在复制
页面时,
映射被初始化,而在创建新页面时却没有初始化吗


谢谢

尝试用不可变变量替换lines变量

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

您可以在

上尝试使用不可变变量替换lines变量

case class Page(index:Int, lines: Map[Int, Line] = Map()) {
    def set(index:Int, line:Line): Page = {
        copy(lines = lines ++ Map(index -> line))
    }
}
您可以在

上试用

这个问题是由于我的persistence层造成的。我使用的系统使用java beans约定,因此它忽略了
私有变量行
。然后当我还原
页面
时,它将其设置为
null

解决方案之一,因为我忘记了在case类中可以使用
private val
是创建另一个类,该类公开
,并在我的持久层中映射/取消映射它

希望,@Rovak能提醒我,我还可以做
case-classs页面(index:Int,private-val-lines:Map[Int,Line]=Map())
。这样我就可以删除所有难看的映射行,并从更干净的方法中获益。另一个优点是
set
方法更干净,不必修改case类。

这个问题是由于我的persistence层造成的。我使用的系统使用java beans约定,因此它忽略了
私有变量行
。然后当我还原
页面
时,它将其设置为
null

解决方案之一,因为我忘记了在case类中可以使用
private val
是创建另一个类,该类公开
,并在我的持久层中映射/取消映射它


希望@Rovak能提醒我,我也可以做
case类页面(index:Int,private-val-Line:Map[Int,Line]=Map())
。这样我就可以删除所有难看的映射行,并从更干净的方法中获益。另一个优点是
set
方法更干净,不需要修改case类。

我没有从这段代码中得到任何错误-你确定没有遗漏一些代码片段可以解释错误吗?哪个比例版本?2.11可以完美地工作。
仅在该方法中使用。因此,没有其他代码可以“取消”
。但如果它对你们所有人都有效,那么它就会出现在我的应用程序中。这是一种副作用,因为我的所有测试都通过了。ThanksCase类应该是不可变的。我没有从这段代码中得到任何错误-你确定没有遗漏一些代码片段可以解释错误吗?哪个Scala版本?2.11可以完美地工作。
仅在该方法中使用。因此没有其他代码可以“取消”
。但如果它对你们所有人都有效,那么它就会出现在我的应用程序中。这是一种副作用,因为我所有的测试都通过了。ThanksCase类应该是不可变的。我想隐藏此映射。然后将其设为私有val?…我觉得很愚蠢。这不是我问题的根源,但它解决了它。(有关问题的详细信息,请参阅答案)。谢谢。我想隐藏此地图。然后将其设置为私人val?…我觉得很愚蠢。这不是我问题的根源,但它解决了问题。(有关问题的详细信息,请参阅答案)。谢谢