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

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

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"))
  }
}




你可能感兴趣的:(Scala学习笔记(五)----单例,伴生对象,类static写法)