用法一: 用于构造函数作用
class Greet(val age: Int) {
var name: String = ""
def output(): Unit = {
print(this.name + ", " + this.age)
}
override def toString: String = this.name + ": " + this.age
}
object Greet {
def apply: Greet = {
new Greet(0)
}
def apply(name: String, age: Int): Greet = {
val greet = new Greet(age)
greet.name = name
greet
}
def unapply(arg: Greet): Option[(String, Int)] = {
if (arg == null) {
None
} else {
Some(arg.name, arg.age)
}
}
}
测试方法
object TestApply {
def main(args: Array[String]): Unit = {
val greet = Greet("Test", 30) //没有使用new,调用的是apply方法;
//case时需要用到unapply方法;如果是case类的话,编译会自动生成apply和unapply方法
greet match {
case Greet(name, age) => println("name: " + name + "; age: " + age)
case _ => println("sorry...")
}
val greet1 = Greet.apply
greet1 match {
case gt: Greet => println("name: " + gt.name + "; age: " + gt.age)
case _ => println("sorry...")
}
}
}
用法二:应用在工厂模式
trait Animal {
def speak(name: String): Unit
}
class Dog extends Animal {
override def speak(name: String): Unit = {
println("This is a dog, is's name: " + name)
}
}
class Cat extends Animal {
override def speak(name: String): Unit = {
println("this is a cat, is's name: " + name)
}
}
object Animal {
def apply(animalType: String): Animal = {
animalType.toLowerCase match {
case "cat" => new Cat
case "dog" => new Dog
case _ => throw new IllegalArgumentException()
}
}
}
测试方法:
object ApplyTest {
def main(args: Array[String]): Unit = {
Animal("Dog").speak("wangwang")
Animal("cat").speak("miaomiao")
}
}