Я все еще изучаю Scala, но одна вещь, которую я считал интересной, заключается в том, что Scala стирает линию между методами и полями. Например, я могу построить такой класс...
class MutableNumber(var value: Int)
Ключевым моментом здесь является то, что переменная var в аргументе конструктора автоматически позволяет мне использовать поле "значение", например, getter/setter в java.
// use number...
val num = new MutableNumber(5)
num.value = 6
println(num.value)
Если я хочу добавить ограничения, я могу сделать это, переключившись на использование методов вместо полей экземпляра:
// require all mutable numbers to be >= 0
class MutableNumber(private var _value: Int) {
require(_value >= 0)
def value: Int = _value
def value_=(other: Int) {
require(other >=0)
_value = other
}
}
Клиентский код не прерывается, так как API не изменяется:
// use number...
val num = new MutableNumber(5)
num.value = 6
println(num.value)
Мой отбой - это функция с именем-параметром, добавленная в Scala -2.8. Если я использую named-parameters, мой API изменится, и он сломает api.
val num = new MutableNumber(value=5) // old API
val num = new MutableNumber(_value=5) // new API
num.value = 6
println(num.value)
Есть ли элегантное решение? Как я должен создать свой класс MutableNumber, чтобы впоследствии добавить ограничения, не нарушая API?
Спасибо!