1. 程式人生 > >Scala 注意事項:object的apply方法

Scala 注意事項:object的apply方法

我們常常定義和使用物件的apply方法來省去new關鍵字。但需要注意在定義apply方法是要加上“()”,且在使用apply方法時“()”同樣不能省去。
正確方式舉例:

class Cleanser {
  private var s = "Cleanser"
  def append(a:String) = {s += a}
  def dilute()={append("dilute()")}
  def scrub()={append("scrub()")}
  override def toString: String = s
  def this(x:String)={
    this
() s = x } } object Cleanser{ def apply(): Cleanser = {new Cleanser} def apply(x:String): Cleanser = {new Cleanser(x)} def main(args: Array[String]): Unit = { val x = Cleanser("hello") val y = Cleanser() } }

如果省略呼叫時的”()”,即

val y = Cleanser

那麼實際上程式僅僅是建立了一個指向Cleanser物件的引用
可以再建立一個z,檢視y和z是否指向同一個記憶體進行驗證

val z = Cleanser

如果省略建立時的“()”,即

def apply: Cleanser = {new Cleanser}

apply僅僅是Cleanser物件的一個普通方法,不會在使用Cleanser()或Cleanser時被呼叫
如果想達到apply()的功能,以下程式碼也可以實現

val y = Cleanser.apply

儘管如此,apply和apply()仍然是同一個方法,不能再同一個物件裡同時定義apply和apply(),會導致一個方法被定義兩次的錯誤。