Можно ли использовать именованные аргументы в конструкторе 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.Таким образом, мы создаем новую приватную локальную переменную и переопределяем методы getter и setter
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 Как переопределить методы получения / установки для элементов, определенных в конструкторе по умолчанию, без уродливости кода или изменения открытого интерфейса?