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