一、object中的apply实战详解
通过伴生对象的apply来构造类的实例比较常用。
package scala.oop
object Apply_11 {
def main(args: Array[String]): Unit = {
val a = ApplyTest() //并没有用new,是因为使用其伴生对象object的apply()
a.haveATry
}
}
object ApplyTest{
def apply() = { //这里必须写括号
println("object")
new ApplyTest
}
}
class ApplyTest{
def apply() = println("class")
def haveATry = println("try")
println("new")
}
输出:
object
new
try
二、class中的apply实战详解
object Apply_11 {
def main(args: Array[String]): Unit = {
val a = new ApplyTest()
a.haveATry
println(a()) // 调用类的apply()
}
}
输出:
new
try
class
()
三、总结
val array = Array(1,2,3,4,5) //实际上调用了Array的apply()
一般构建集合都用此种apply方式,好处:
1.若集合嵌套集合,则不需要写很多“new”.很方便简单。
2.构建实例时,若要进行实例对象的单例控制,那么在object的apply()将是个非常好的控制地方。例如可以在apply()中判断是否有身份去构建对象等等
3.若一个类是抽象类(如spark中图计算的抽象类Graph),这个抽象类有个伴生对象(object Graph),这个伴生对象有个apply(),apply()会构建这个抽象类的实例(new GraphImpl() )。
因为抽象类构建实例时不能直接new,所以在这个apply中,就会直接使用这个抽象类的具体实现类去构建抽象类的具体子类的实例。这就是面向接口编程,在apply中写new GraphImpl() ,具体的实现不用apply()操心,由具体子类负责。