Вопрос о свойствах Scala

Я все еще изучаю 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?

Спасибо!

11
задан shj 11 November 2010 в 20:20
поделиться