Scala学习笔记(五)----单例,伴生对象,类static写法

来源:互联网 发布:网络赚小钱 编辑:程序博客网 时间:2024/06/11 17:08

直接上代码 注意点写在注释里了

package cn.limbo.demo/**  *Scala里面创建单例对象非常简单,创建单例对象需要用到object关键字,而非class。因为单例对象无法初始化,所以不能给他的祝构造函数传递参数  */class Marker(val color:String){  println("Creating " + this.color)  override def toString(): String = "marker color " + this.color}/**  *创建了一个Marker的工厂类  */object MarkerFactory {  private val markers = Map(    "red"->new Marker("red"),    "blue"->new Marker("blue"),    "green"->new Marker("green")  )  def getMarker(color:String)=    if(markers.contains(color))      markers(color)  else      null}object test {  def main(args: Array[String]) {    println(MarkerFactory getMarker("blue"))    println(MarkerFactory getMarker("red"))    println(MarkerFactory getMarker("green"))    println(MarkerFactory getMarker("pink"))  }}
不过这段代码有一个问题就是,我们可以跳过MarkerFactory直接创建Marker类
MarkerFactory 就是一个独立对象的例子。尽管它管理着Marker类,但是它并没有关联到任何类上。

package cn.limbo.demo/**  * scala也可以创建关联到类上的对象。这样的对象同类共享同一个名字,这样的对象称为伴生对象,对应的类就称为伴生类。  * 在scala里,类和伴生对象没有界限,它们互相可以访问彼此的private 方法和private 属性。下面使用伴生对象重写了Marker  */class Marker private (val color :String ){  println("Creating " + this)  override def toString() : String = "marker color " + color}/**  * 在重构后的代码中为Marker类新建了伴生对象,伴生对象就是Marker类的实例了。  * 此外还使用private修饰了Marker的主构造函数,确保只有它的伴生对象可以创建Marker类的实例,从而保证了Marker类的单例特性。  * 当然了,也可以不把Marker类的主构造函数声明为private,但是此时Marker对象作为Marker类的单例实现就仍是不严密的。  */object Marker{  private val markers = Map(    "red"->new Marker("red"),    "blue"->new Marker("blue"),    "green"->new Marker("green")  )  def getMarker(color:String)=    if(markers.contains(color))      markers(color)    else      null  def apply(color:String) =    if(markers.contains(color))      markers(color)    else      null}object test {  def main(args: Array[String]) {    println(Marker.getMarker("red"))    println(Marker getMarker "red")    //伴生对象还有一点好处:创建伴生类的实力不需要new关键字。这件妙事是apply()方法提供的,它是Scala的语法糖。以下代码只要调用Marker("red")    //就可以创建Marker实例了,其实是调用了Marker.apply("red")    println(Marker("red"))    println(Marker.getMarker("green"))    println(Marker.getMarker("blue"))    println(Marker.getMarker("pink"))  }}




0 0