1.伴生对象(object)为class实现单例

在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的实现方法,那就是使用关键字 object。

Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数。

当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。

class ApplyTest private{  //添加private隐藏构造器
  def sayHello(){
    println("hello jop")
  }
}
 
object ApplyTest{
  var instant:ApplyTest=null
  def apply() ={
    if(instant==null) instant=new ApplyTest
    instant
 
  }
}
 
object ApplyDemo {
  def main(args:Array[String]){
      val t=ApplyTest()
      t.sayHello()
  }
}

2.伴生对象(object)为class初始化

在object中一般可以为伴生类做一些初始化等操作,如我们常常使用的val array=Array(1,2,3) (ps:其使用了apply方法)

//私有构造方法
class Marker private(val color:String) {
  println("创建" + this)
  override def toString(): String = "颜色标记:"+ color
  
}

// 伴生对象,与类共享名字,可以访问类的私有属性和方法
object Marker{
  
    private val markers: Map[String, Marker] = Map(
      "red" -> new Marker("red"),
      "blue" -> new Marker("blue"),
      "green" -> new Marker("green")
    )
    
    //apply就是构造函数,用来初始化变量
    def apply(color:String) = {
      if(markers.contains(color)) markers(color) else null
    }
  
    def getMarker(color:String) = { 
      if(markers.contains(color)) markers(color) else null
    }
    def main(args: Array[String]) { 
        println(Marker("red"))  
        // 单例函数调用,省略了.(点)符号 
        println(Marker getMarker "blue")  
    }
}

总结:

  1. 因为class没有static关键字,如果需要使用静态的变量,实现单例等等,就需要借助object(伴生对象)来完成。
  2. object里面所有的东西都是静态的,所以object里面可以定义main函数,class想要被使用,只能在object中实例化,也就是new TestClass()。