2016-05-26 3 views
1

Есть ли в Scala какой-то синтаксический сахар для «непреложных классных сеттеров»?scala неизменный класс vals сеттеры

Вот пример:

class Bob (val x:Int, val y:String) 

Для того, чтобы изменить x или y, я могу реализовать это следующим образом:

object Bob { 
    def updX (b:Bob) (x:Int) = new Bob (x, b.y) 
    def updY (b:Bob) (y:String) = new Bob (b.x, y) 
} 
class Bob (val x:Int, val y:String) { 
    def updX (x:Int) = Bob.updX(this)(x) 
    def updY (y:String) = Bob.updY(this)(y) 
} 

Это решение ужасно, потому что некоторые из моих классов имеют 8 параметров ,

Есть ли лучший способ достичь этого?

+0

Вы имеете в виду метод 'copy' на класс case? –

ответ

0

В @ инсан-е упоминает в his answer, шаблон, который используется тематических классов, является copy метод с параметрами соответствующих значений по умолчанию и конструктор, соответствующие val с. Вы можете легко реализовать это самостоятельно:

class Bob(val x: Int, val y: String) { 
    def copy(x: Int = x, y: String = y) = new Bob(x, y) 
} 
+0

Спасибо за это, этот синтаксис замечательный. Думаю, мне нужно больше узнать о возможностях синтаксиса Scala. – AntoineKa

5

Если вы создадите класс класса case, вы получите бесплатный способ копирования. Параметры класса case автоматически неизменяемы, поэтому нет необходимости ставить val перед ними.

case class Bob(x: Int, y: String) 

val bob1 = Bob(1, "Bob1") 
val bob2 = bob1.copy(y = "Bob2") 
+0

Класс случая с копией, по-видимому, является подходящим решением. Спасибо, я думал, что они полезны только при деконструкции в сопоставлении с образцом. – AntoineKa

+0

Если вам не нравится другой материал, который поставляется с классом case, вы всегда можете просто написать метод 'copy' самостоятельно. –

Смежные вопросы