首页 > 代码库 > Scala对象

Scala对象

单例对象

Scala没有静态方法或静态字段,你可以用object这个语法结构来达到同样目的,
object HelloWorld {
  private var lastNumber = 0
  def newUniqueNumber()={lastNumber+=1;lastNumber}
}
使用的时候直接调用HelloWorld.newUniqueNumber()即可。对象的构造器在该对象第一次被使用时调用,如果一个对象从未被使用,那么其构造器也不会被执行。在Scala中用对象可以来实现:
  • 作为存放工具函数或常量的地方
  • 高效地共享单个不可变实例
  • 需要用单个实例来协调某个服务时
类和它的伴生对象可以相互访问私有特性,它们必须存在于同一个源文件中。调用方式:Account.newUniqueNumber()来调用伴生对象的方法
class Account{ 
}
object Account{//伴生对象
  private var lastNumber = 0
  private def newUniqueNumber()={lastNumber+=1;lastNumber}
}

apply方法

当Object(参数1,...,参数N),通常这样一个apply方法返回的是伴生类的对象。Array(100)和new Array(100)很容易搞混。前一个调用的是apply(100),输出一个单元素的Array[Int],而第二个调用的是构造器this(100),结果是Array[Nothing],它包含了100个null元素。

应用程序对象

每个Scala程序都必须从一个对象的main方法开始,方法类型为Array[String]=>Unit:
object Hello{
    def main(args : Array[String]){
        println()
    }
}
除了每次都提供自己的main方法外,你也可以扩展App特质,然后将程序代码放进构造器方法体内:
object Hello extends App{
    def main(args : Array[String]){
        println()
    }
}

Enumeration

object MyEnum extends Enumeration {
  //定义三个字段,然后用Value调用将它们初始化,每次调用Value都返回内部类的新实例,该内部类也叫做Value,或者你也可以向Value方法传入ID/名称/两个参数都传
  val Red, Yellow, Green = Value
}
object Hi {
  def main(args: Array[String]) {
    //可以通过如下语句直接引入枚举值
    //import MyEnum._
    //记住枚举的类型是MyEnum.Value而不是MyEnum
    //type MyEnum = Value //此句话用来设置类型别名,这样的话,枚举的类型就变成了MyEnum.MyEnum
    //枚举值的ID可通过id方法返回,名称通过toString方法返回,对MyEnum.values的调用输出所有枚举值的集合
    //可以通过枚举的ID或名称来进行查找定位,以下两句输出内容一样
    println(MyEnum(0))
    println(MyEnum.withName("Red"))
  }
}