2010-10-22 3 views
3

Я довольно новичок в Scala, исходя из базового фона Java. Я посмотрел, как реализовать конструкторы классов и как обеспечить некоторую логику в установщике для поля этого класса.Class Constructor/Setter

class SetterTest(private var _x: Int) { 
    def x: Int = _x 
    def x_=(x: Int) { 
     if (x < 0) this._x = x * (-1) 
    } 
} 

Параметр конструктора присваивается поле _x, поэтому связующий не используется. Что делать, если я хочу использовать логику сеттера?

object Test { 
    def main(args: Array[String]) { 
     val b = new SetterTest(-10) 
     println(b.x) // -10 
     b.x = -10 
     println(b.x) // 10 
    } 
} 

В Java я мог бы использовать установщик в конструкторе для принудительного использования этого образца куска логики.

Как я могу достичь этого в scala?

ответ

6

В Scala все тело класса составляет основной конструктор. Таким образом, вы можете просто сделать это:

class SetterTest(private var _x: Int) { 
    x = _x // this will invoke your custom assignment operator during construction 

    def x: Int = _x 
    def x_=(x: Int) { 
    if (x < 0) this._x = x * (-1) 
    } 
} 

Теперь попробовать:

scala> new SetterTest(-9).x 
res14: Int = 9 
+3

Да, это одна из болевых точек в Scala. У вас может быть короткий короткий код без сеттеров или какой-то Java-подобный раздутый с сеттерами. Проблема заключается в том, что компилятор не распознает его, если вы сами определяете настройки/getters и не сработаете с некоторым невольным сообщением об ошибке. Кроме того, установка членов класса через конструктор обходит любой определенный метод setter, нарушая принцип унифицированного доступа. Это один из темных пятен Scala ... – soc

+0

@ pelotom: Спасибо за быстрое решение. @soc +1 для приведения дальнейших мыслей, чтобы помочь мне оценить, что я изучаю. – rdoubleui

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