6.1单例对象
scala没有静态方法或静态字段,可以使用object这个语法来达到同样的目的。对象定义了某个类的单个实例,包含了你想要的特性。
object Accounts{
private var lastNumber=0
def newUniqueNumber()={lastNumber+=1;lastNumber}
}
对象的构造器在对象第一次被使用的时候执行,在本例中Accounts的构造器在Accounts.newUNIQUEnumber()首次调用时执行。如果一个个对象从来没被使用,构造器也不会被执行。
对象本质上拥有类的所有特性,甚至可以扩展其它类或特质。只有一个例外:你不用提供构造器参数。
什么情况下使用对象:1.作为存放工具函数或常量的地方
2.高效的共享单个不可变实例
3.需要用单个实例来协调某个服务时。
6.2伴生对象
在Jave中,通常会遇到既有实例方法又有静态方法的类=。在Scala中,你可以通过类和类的伴生对象来达到同样的目的。列如:
class Account{
val id=Account.newUniqueNumber()
private var balance=0.0
def deposit(amout:Double) {
balance+=amout }
...
}
object Account{ //伴生对象
private var lastUmer=0
private def newUniqueNumbe() ={ lastNumber+=1;lastNumber}
类和他的伴生对象可以相互访问私有特性,他们必须在同一个源文件中,
说明:类的伴生对象可以被访问,但并不在作用域中。举例来说:Account类必须通过Account.newUniqueNumbe()而不是直接使用newUniqueNumber()来调用伴生对象的方法。
6.3扩展类或特质的对象
一个object可用扩展类以及一个或多个特质,其结果是一个扩展了指定类以及特质的类的对象。
6.4apply方法
我们通常会使用对象的apply方法,当遇到如下的表达式,apply方法就会被调用:
Object(参数1,....参数n)
通常,这个一个apply方法返回的是伴生类的对象。
6.5 应用程序
每个scala程序都有必须从一个对象的main方法开始,这个方法的类型Array[String]=>Unit:
object Hello extends App {
def main(args:Array[String]):Unit{
}
}
如果在调用应用程序设置了scala.time选项的话,程序退出会显示逝去的时间。
$ scala -Dscala.time Hello Fred
App特质扩展自另一个特质DelayeInit,编译器对该特质有特殊处理。
6.6枚举
scala没有枚举类型,不过,标准类库提供了一个Enumeration助手类,可以用于产生枚举。
定义一个扩展Enumeration类的对象并以value方法调用初始化枚举中的所有可选值。例如:
object TrafficLightColor extends Enumeration{
val red,Yellow,Green=Value
}
本文介绍Scala中的单例对象及其用途,包括工具函数存放、高效共享实例及服务协调等场景。同时探讨伴生对象的概念,如何实现类与静态方法的结合,并解释类与伴生对象间的私有特性的访问。
716

被折叠的 条评论
为什么被折叠?



