Я все еще изучаю Scala, но мне показалось интересным то, что Scala стирает грань между методами и полями. Например, я могу создать такой класс ...
class MutableNumber(var value: Int)
Ключевым моментом здесь является то, что переменная в аргументе-конструкторе автоматически позволяет мне использовать поле 'value' как 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-параметры, мой 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?
Спасибо!