Похоже, что проблема очень решена в 2.8:
case class Employee(name: String, age: Int)
val joe = Employee("Joe", 25)
val bob = joe copy (name = "Bob")
Объедините это со значениями по умолчанию, и приведенный вами пример можно легко переписать как класс case, который я считаю «правильным» способом реализации неизменяемого типа данных. (Я не уверен, верно ли это для scala, но, исходя из ocaml / haskell, это кажется правильным.)
В 2.7 вам потребуется реализовать множество вспомогательных функций:
def asUsed(r: Record): Record = {
Record(r.productCode, r.price, r.nodes, Some(true))
}
Тьфу. Они должны действительно поторопиться 2.8 ...