1.只是一个快捷方式
首先定义个object:
object Greet {
def apply(name: String): Unit = {
println("Call From %s".format(name))
}
}
object Main {
def main(args: Array[String]): Unit = {
Greet.apply("Gpwner")
println("==========================")
Greet("pwner")
}
}
控制台输出:
所以当调用一个Object的时候,其实就是相当于调用了这个Object的apply方法
但是apply并不等同与构造函数
2.scala会自动为case class 生成apply方法
下面的三个操作都是一样的结果:
val p0 = new Person("Frank", 23, "Blue") // normal constructor
val p1 = Person("Frank", 23, "Blue") // this uses apply
val p2 = Person.apply("Frank", 23, "Blue") // using apply manually
3、apply应用于builder模式
一个object中的apply方法不一定要返回其自身对象,比如
case class Company(name: String)
class Person(val name: String) {}
object Person {
def apply(name: String): Company = new Company(name)
}
当调用Person的apply的时候返回的是Company对象
利用这个特点我们可以将一个类写成Builder
abstract class DatabaseDriver {
// some database stuff
}
object DatabaseDriver {
def apply(config: Configuration) = config.dbType match {
case "MYSQL" => new MySqlDriver()
case "PSQL" => new PostgresDriver()
case _ => new GenericDriver()
}
}
// now I get the right version!
val mydatabase = DatabaseDriver(dbConfig)
4、apply应用于匿名函数
两个语句一样的结果:
5、在class中的apply
可以在object中有apply方法,当然也在class中定义apply方法
class Amazing {
def apply(x: String) = "Amazing %s!".format(x)
}
// look how cool this is
val amazing = new Amazing()
amazing("world")
// => Amazing world!
amazing.apply("world")
// => Amazing world!