2015-12-16 292 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方法更乾淨,不必修改案例類。