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