6 Scala對象

  • object ,需要某個類的單例實例或者其他值或函數一個掛靠的地方。
  • 用對象作爲單例或存放工具的方法

單例對象

  • Scala用object達到靜態方法或靜態字段的目的
  • 對象定義了某個類的單個實例
  • 對象的構造器在該對象第一次被使用時調用,如果不被使用,那麼構造器也不會被執行
  • 對象本質上可以擁有類的所有特性,可以擴展其他類或特質,但是不能提供構造器參數
  • 對象的使用場景
    – 存放工具函數或常量
    –高效共享單個不可變實例
    –需要用單個實例協調某個服務
object Accounts{
  private var lastNumber = 0
  def newUniqueNumber():Int={
    lastNumber += 1
    lastNumber
  }
}

伴生對象

  • 對象和類同名,互爲伴生,伴生對象伴生類
  • 類和它的伴生對象可以互相訪問私有特性,必須放在同一個源文件中
  • 類的伴生對象的功能特性不在類的作用域內,Account類內不能直接使用newUniqueNumber()
//伴生類
class Account {
  val id = Account.newUniqueNumber()
  private var balance = 0.0

  def deposit(amount: Double): Unit = {
    balance += amount
  }

  def yue = balance
}
//伴生對象
object Account{
  private var lastNumber = 0
  private def newUniqueNumber():Int={
    lastNumber+=1
    lastNumber
  }
}
//使用
val sam = new Account
println(sam.id)
println(sam.yue)
sam.deposit(1000)
println(sam.yue)

擴展類或特質的對象

  • object可以擴展類以及一個或多個特質,其結果是一個擴展了指定類以及特質的類的對象,同時擁有對象定義中給出的所有特性
abstract class UndoableAction(val description:String){
  def undo():Unit
  def redo():Unit
}
object DoNothingAction extends UndoableAction("Do Nothing"){
  override def undo(): Unit = {}
  override def redo(): Unit = {}
}


val actions = Map("open"->DoNothingAction,"save"->DoNothingAction)

Apply方法

  • Object(參數1,參數2,…,參數n) 會調用對象的apply方法,返回的是伴生類的對象
  • 例如Array定義了apply方法,因此可以不用new Array,直接使用Array()
//類
class Account private(val id:Int,initialBalance:Double){
  private var balance = initialBalance
}
//伴生對象
object Account{
  def apply(initialBalance: Double): Account = {
    new Account(newUniqueNumber,initialBalance)
  }
  private var lastNumber = 0
  private def newUniqueNumber():Int={
    lastNumber+=1
    lastNumber
  }
}
//使用時不用new了,伴生對象裏定義了apply方法,裏面已經new了
val sam = Account(12)
val bob = Account(400)
println(bob.id)

應用程序對象

  • 每個scala程序必須從一個main方法開始,方法的類型爲Array[String] => Unit
  • 如果不用main方法,可以擴展App特質,如果需要命令行參數可以通過args屬性獲得
object Hello extends App{
  if(args.length>0){
    println(f"Hello ${args(0)}")
  }else{
    println("Hello World")
  }
}

枚舉

  • 使用Enumeration助手類產生枚舉
  • 枚舉的類型是TrafficLightColor.Value
  • 獲取id和名稱通過id和toString方法
object TrafficLightColor extends Enumeration{
  //val Red,Yellow,Green = Value
  //Value 可以傳入ID、名稱,或兩個同時,如果不傳入名稱則爲變量名
  val Red = Value(0,"Stop")
  val Yellow=Value(10)
  val Green=Value("Go")
}

//使用
scala> TrafficLightColor.Red
res20: TrafficLightColor.Value = Stop

scala> TrafficLightColor.Green
res21: TrafficLightColor.Value = Go

scala> TrafficLightColor.Yellow
res22: TrafficLightColor.Value = 10

// id和名稱通過id和toString方法
scala> TrafficLightColor.Yellow.toString
res25: String = Yellow

scala> TrafficLightColor.Yellow.id
res26: Int = 10

// 遍歷所有的枚舉值
scala> for(i <- TrafficLightColor.values) println(s"${i.id}:$i")
0:Stop
10:Yellow
11:Go

// 通過ID或名稱查找定位
scala> TrafficLightColor.withName("Yellow")
res43: TrafficLightColor.Value = Yellow

scala> TrafficLightColor(11)
res44: TrafficLightColor.Value = Go


發佈了75 篇原創文章 · 獲贊 83 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章