Конструкторы Scala, именованные аргументы и неявные геттеры / сеттеры

Можно ли использовать именованные аргументы в конструкторе Scala, а затем переопределить геттеры и сеттеры, не нарушая интерфейс конструктора или не делая код чрезвычайно уродливым?

Возьмите следующий фрагмент кода Scala

class Person( var FirstName: String, var LastName: String )

Красиво и чисто. Это создаст простой класс под названием person, который мы могли бы использовать следующим образом

val john = new Person( FirstName="John", LastName="Doe" )
john.FirstName = "Joe"
println( john.FirstName )

. Позже мы решаем, что хотим добавить некоторую проверку в установщик FirstName. Таким образом, мы создаем новую частную локальную переменную и переопределяем методы получения и установки

class Person( var _FirstName: String, var _LastName: String ) {

    def FirstName = _FirstName  
    def FirstName_= (value:String) = _FirstName = value

}

Все еще несколько чистые, однако для этого нам пришлось изменить имена аргументов конструктора, нарушив, таким образом, внешний интерфейс.

Первым решением этой проблемы, которое я придумал, было

class Person {
    var _FirstName:String = null 
    var LastName:String  = null

    def FirstName = _FirstName  
    def FirstName_= (value:String) = _FirstName = value

    def this( FirstName: String, LastName: String ){
        this()
        this._FirstName = FirstName
        this.LastName = LastName 
    }

}

, которое несколько некрасиво и неэлегантно и устраняет большинство хороших причин, по которым я изначально использовал scala.

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

tl; dr Как переопределить методы получения / установки для членов, определенных в конструкторе по умолчанию, не делая код некрасивым или изменяя открытый интерфейс?

10
задан James Davies 21 February 2011 в 13:43
поделиться