首页 > 代码库 > Scala类

Scala类

要点

  • 类中的字段自动带有getter方法和setter方法
  • 可以用定制的getter/setter方法替换掉字段的定义,而不必修改使用类的客户端----这就是“统一访问原则”
  • 用@BeanProperty注解来生成JavaBeans的getXxx/setXxx方法
  • 每个类都有一个主要的构造器,这个构造器和类定义“交织”在一起。它的参数直接成为类的字段,主构造器执行类体中所有的语句。
  • 辅助构造器是可选的,它们叫做this
在Scala源文件中,可以包含多个类,所有这些类都具有共有可见性。
Scala对每个字段都提供setter和getter方法,比如class Person{var age = 0},Scala生成面向JVM的类,其中有一个私有的age字段以及相应的getter和setter方法,这两个方法是公有的,如果age是私有的,那么相应的getter和setter也是私有的,在Scala中,getter和setter分别叫做age和age_=。默认的getter和setter是由Scala自动生成,但是你也可以手动生成,例如:
class Person {
  private var privateAge = 0
  def age = privateAge
  def age_=(newAge: Int) {
    if (newAge > privateAge) privateAge = newAge
  }
}
object HelloWorld {
  def main(args: Array[String]) {
    var p = new Person()
    p.age = 11
    p.age_=(1) //设置age的值,但是该调用其实相当于调用setter方法,在setter方法中有控制语句,所以该句话不起作用
    println(p.age) //取出age的值,相当于getter方法
  }
}

统一访问原则

由Eiffel语言的发明者Bertrand Meyer提出,内容是“某个模块提供的所有服务都应该能通过统一的表示法访问到,至于它们是通过存储还是通过计算来实现的,从访问方式上应无从获知”。
Scala对setter和getter的控制
  1. 如果字段是私有的,则getter和setter方法也是私有的
  2. 如果字段是val,则只有getter方法被生成
  3. 如果你不需要任何getter和setter,可以将字段声明为private[this]
总结,在实现属性时有如下四种选择:
  • var foo:Scala自动合成一个getter和setter
  • val foo:Scala自动合成getter
  • 由你来定义foo和foo_=方法
  • 由你来定义foo方法

对象私有字段

private [this] var value = http://www.mamicode.com/0//类似于某个对象.value这样的访问将不被允许
这时候,value就是对象私有的,其他同一个类的对象也无法访问到,对象私有的字段,Scala不会生成getter或setter方法。

Bean属性

如果你将Scala对象标注为@BeanProperty时,例如:@BeanProperty var name : String = _
将会生成四个方法:
1. name:String
2. name_=(newValue:String):Unit
3. getName():String
4. setName(newValue:String):Unit

构造器

Scala类有一个构造器比其他所有构造器都更为重要,它就是主构造器,除了主构造器之外,类还有任意多的辅助构造器,辅助构造器的特点如下:
1. 辅助构造器的名称为this
2. 每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始

在Scala中,如果没有显式定义主构造器,则自动拥有一个无参的主构造器,主构造器并不以this方法定义,而是与类定义交织在一起。
主构造器的参数直接放置在类名之后
class Person(val name: String, val age: Int) {
  //(...)中的内容就是主构造器中的内容
}
如果类名之后没有参数,则该类具备一个无参主构造器。这样一个构造器仅仅是简单地执行类体中的所有语句而已。

主构造器参数
生成的字段/方法
name:String
对象私有字段
private val/var name:String
私有字段,私有的getter/setter方法
val/var name:String 
私有字段,公有的getter/setter方法
@BeanProperty val/var name:String
私有字段,公有的Scala版和JavaBean版getter/setter方法
如果想让主构造器变成私有的,可以这样放置private关键字:
class Person private (val id : Int){...};这样用户就必须通过辅助构造器来构造Person对象

嵌套类

在Scala中,你几乎可以在任何语法结构中内嵌任何语法结构,你可以在函数中定义函数,在类中定义类。要构造一个新的内部对象,只需要简单的new这个类名:new 外部类.内部类。在内嵌类中,你可以通过外部类.this的方式来访问外部类的this引用,还可以用如下语法建立一个指向该引用的别名
class NetWork(val name: String) {
  outer =>
  class Member(val name: String) {
    ...
    def description = name + " inside " + outer.name
  }
}
class NetWork{outer=>语法使得outer变量指向NetWork.this。对这个变量,可以使用任何合法的名称。}