类
简单类和无参方法
Scala类最简单的形式看上去和Java中的很相似
class Counter {
private var value = 0 //字段必须初始化
def increment() {
//方法默认是公有的
value += 1
}
def current() = value
}
Scala中类并不申明为public。Scala源文件可以包含多个类,所有这些类都具有公有可见性。
使用类要做的是构造对象并按照通常的方法来调用方法:
val myCounter = new Counter //或new Counter()
myCounter.increment()
println(myCounter.current) //或myCounter.current()
使用哪种风格?对于改变对象状态的方法,使用()。而对于不会改变对象状态的方法去掉()。
可以通过以不带()的方式申明current来强制这种风格:
class Counter {
...
def current = value //定义中不带()
}
//用此方法定义,使用者就必须使用myCounter.current。不能带圆括号
带getter和setter的属性
之所以说getter和setter方法比共有字段更好,是因为他们让你可以从简单的get/set机制出发,并在需要的时候做改进。
Scala对每个字段都提供getter和setter方法。
class Person {
//定义一个公有字段
var age = 0
private var name = ""
}
scala生成面向jvm的类,有一个私有的age字段及相应的getter和setter方法。方法是共有的。(对私有字段而言,getter和setter方法也是私有的。)
scala中,getter和setter分别叫做age和age_=。
println(fred.age) //调用fred.age()
fred.age = 21 //调用fred_=(21)
编译命令:
$ scalac Person.scala
$ javap -private Person
# 在REPL内运行javap命令
:javap -private Person
自定义getter和setter方法:
class Person {
private var privateAge = 0 //变为私有并改名
def age = privateAge
def age_=(newValue:Int){
if(newValue > privateAge) privateAge = newValue
}
}
//依然可以访问fred.age
val fred = new Person
fred.age = 30
fred.age = 21
println(fred.age) //30
统一访问原则:某个模块提供的所有服务都应该能通过统一的表示法访问到,至于它们是通过存储还是通过计算来实现的,从访问方式上应无从获知。
Scala对每个字段生成getter和setter方法,可以进行控制。
- 如果字段是私有的,则getter和setter方法也是私有的
- 如果字段是val,则只有getter方法被生成。
- 如果你不需要任何getter和setter,可以将字段声明为private[this]
只带getter的属性
有时只需一个只读属性,有getter没setter。如果属性的值在对象构建完成后就不再改变,可以使用val字段:
//生成私有的final字段和一个getter方法,但没有setter
class Message