2015-12-16 5 views
0

У меня странная вещь в моем коде и не могу понять причину. Возможно, это функция Scala, о которой я не знаю.Scala кейс класс. Частный var не инициализирован

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 beans и поэтому игнорирует private var lines. Затем, когда я восстановить Page это установить его в null ..

Одним из решений, потому что я забыл, что мы можем иметь private val в случае класс должен был создать другой класс, который разоблачить карту lines и/Unmap его в мой слой сохранения.

Надеюсь, @Rovak напомнит мне, что я также могу сделать case classs Page(index: Int, private val lines:Map[Int, Line]=Map()). Чтобы я мог удалить все эти уродливые линии отображения и извлечь выгоду из более чистого подхода. Другим преимуществом является то, что метод set является более чистым и не требует изменения класса case.