好程式設計師大資料學習路線分享scala單列和伴生物件

好程式設計師IT發表於2019-08-21

好程式設計師大資料學習路線分享scala單列和伴生物件

scala單例

object SingletonDemo {

  def main(args: Array[String]): Unit = {

    val s = SessionFactory

    println(s.getSession)

    println(s.getSession.size)  //.size得到幾個session物件

  }

}

object SessionFactory{

  println("SessionFactory 被執行了")

  

  //計數器

  var i = 5


  //存放session物件的陣列

  val sessions = new ArrayBuffer[Session]()

  while(i>1){

    println("while被執行了")

    sessions.append(new Session)

    i -= 1

  }


  //獲取session物件

  def getSession = sessions

}


class Session{


}

伴生物件

單例物件包括伴生物件,類與伴生物件之間可以互相訪問,即使被private修飾的私有欄位和屬性

伴生物件首先是一個單例物件,單例物件用object定義


在scala中,單例物件分兩種

1.關聯並未自動關聯到特定類的單例物件,稱為獨立物件 -> Standalone Object

2.關聯到一個類的單例物件,該單例物件與該類是同一個類名,稱為伴生物件 -> Companion Object

class companionObject {

  var id = 0

  private val name = "zhaoxiaodan"

  def printContent() = {

    println(name+companionObject.Constant)

  }

}


object companionObject {

  private val Constant = " is my goddess"

  def main(args: Array[String]): Unit = {

    val co = new companionObject

    co.id = 8

    println(co.id)

    println(co.name)

    co.printContent()  //zhaoxiaodan is my goddess

  }

}

apply和unapply (通常在類的伴生物件中定義apply方法)

apply方法通常被稱為注入方法,在類的伴生物件中做一個初始化操作

apply方法的引數列表不需要和主構造器列表統一


unapply方法通常為提取方法,使用unapply方法可以提取構造器中固定數量的物件和值

unapply方法會返回一個Option,如果Option裡有值的話,內部會有一個some物件來封裝這些值

class ApplyDemo(val name: String, val age: Int, val faceValue: Int) {


}


object ApplyDemo {

  //注入方法

  def apply(name: String, age: Int): ApplyDemo = {

    new ApplyDemo(name,age,faceValue = 80)  //初始化

  }

  //提取方法

  def unapply(applyDemo: ApplyDemo):Option[(String,Int,Int)]={

    if (applyDemo == null){

      None

    }else{

      Some(applyDemo.name,applyDemo.age,applyDemo.faceValue)

    }

  }

}


object ApplyTest{

  def main(args: Array[String]): Unit = {

    val applyDemo = ApplyDemo("趙曉丹",18)

    applyDemo match {

      case ApplyDemo("趙曉丹",age,faceValue) =>println(s"name:趙曉丹,age:$age,fv:$faceValue")

      case _=> println("is null")

    }

  }

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2654457/,如需轉載,請註明出處,否則將追究法律責任。

相關文章