2015-12-16 118 views
0

我的代码中有一件奇怪的事情,无法确定原因。也许这是我不知道的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时被初始化,但是当我创建一个新地图时没有被初始化?

感谢

+1

我没有从这段代码中得到任何错误 - 你确定没有一些代码片段可以解释错误吗? – Shadowlands

+1

哪个Scala版本? 2.11完美无瑕。 – Reactormonk

+0

与2.11.7一起使用 – TheKojuEffect

回答

4

尝试用一成不变的变量替换线变量

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/

+0

我想保留此地图隐藏。 –

+1

然后让它成为一个私人val? – Rovak

+0

...我觉得很愚蠢。这不是我的问题的根源,但它无论如何解决它。 (有关问题的详细信息,请参阅答案)。谢谢 –

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方法更干净,不必修改案例类。