Scala中声明一个类与Java很相似:
class Counter {
private var value = 0 // 必须初始化字段
def increment() { value += 1 } // 方法默认为public
def current() = value
}
类并不声明为public,一个Scala源文件可以包含多个类,这些类都具有公有可见性。
实例化类的时候,同样的采用val myCounter = new Counter()的形式。
调用无参方法时,()可以省略,即myCounter.current等同于myCounter.current()。
Scala建议的编码吗风格是:对于改值器方法,使用();对于取值器方法,不使用()。
也可以在声明时直接不添加()来强制在调用时不能添加(),即采用def current = value的形式进行声明。
在Java中,我们不鼓励使用公有字段,而是通过getter和setter去读取或修改属性。在Scala中,我们只需要自己声明字段即可,Scala会自动生成getter与setter。假设有以下这样一个类:
class Person {
var age = 0
}
对于age字段来说,生成的getter与setter方法分别叫age和age_=。
知道了命名规则以后,我们可以选择覆盖getter与setter:
class Person {
private var privateAge = 0
def age = privateAge
def age_=(newValue: Int) {
if (newValue > privateAge) privateAge = newValue
}
}
总结一下,Scala的getter与setter具有以下规律:
getter与setter也是私有的。val,则只有getter被生成。getter或setter,可以将字段声明为private[this]。如果需要一个只读属性,可以使用val字段,这样对象在构建完成以后这个属性值就不会再被改变。
有时,我们不希望使用者随意更改某个值,但可以通过其他方式改变。如下:
class Counter {
private var value = 0
def increment() {
value += 1
}
def current = value
}
Counter的current属性在调用increment时更新,但没有对应的setter。
总结一下,在实现属性时有四种情况:
var foo:Scala自动合成一个getter和setter。val foo:Scala自动合成一个getter。foo和foo_=方法。foo方法。可以看出,Scala不支持只有
setter而没有getter的属性。
在Scala中,方法可以访问一个类的所有对象的私有字段,如:
class Counter {
private var value = 0
def increment() {
value += 1
}
def current = value
def isLess(other: Counter) = value < other.value
}
other也是Counter对象,所以可以被访问到,如果想制定更严格的访问控制,可以采用如下语句:
private[this] var value = 0的,
这样一来,Counter类的对象只能访问当前对象的value字段,这样的访问被称为对象私有。