私はまだScalaを学んでいますが、興味深いと思ったのは、Scalaがメソッドとフィールドの境界線を曖昧にしていることです。たとえば、このようなクラスを作成できます...
class MutableNumber(var value: Int)
ここで重要なのは、constructor-argumentのvarにより、javaのgetter/setterのように「value」フィールドを自動的に使用できるようになることです。
// use number...
val num = new MutableNumber(5)
num.value = 6
println(num.value)
制約を追加したい場合は、instance-fieldsの代わりにメソッドを使用するように切り替えることで追加できます。
// 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)
これに対するエレガントな解決策はありますか?APIを壊さずに後で制約を追加できるように、MutableNumberクラスをどのように設計する必要がありますか?
ありがとう!