我们常常定义和使用对象的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(),会导致一个方法被定义两次的错误。