Scala案例类。私有变量未初始化
我的代码中有一个奇怪的东西,无法找出原因。也许这是我不知道的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
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?…我觉得很愚蠢。这不是我问题的根源,但它解决了问题。(有关问题的详细信息,请参阅答案)。谢谢