【发布时间】:2011-05-08 17:12:47
【问题描述】:
我仍在学习 Scala,但我认为有趣的一件事是 Scala 模糊了方法和字段之间的界限。例如,我可以构建一个这样的类...
class MutableNumber(var value: Int)
这里的关键是构造函数参数中的 var 自动允许我像 java 中的 getter/setter 一样使用“值”字段。
// 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 的情况下添加约束?
谢谢!
【问题讨论】:
标签: scala properties scala-2.8 javabeans named-parameters