Scala 注意事項:object的apply方法
阿新 • • 發佈:2019-02-04
我們常常定義和使用物件的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(),會導致一個方法被定義兩次的錯誤。