applyの説明
class Human(val name: String, val age: Int) { } object Human { def apply(name: String, age:Int) = { new Human(name, age) } }
としておくと、以下のようにインスタンスを生成できる。
val h = Human("taro", 20)
コンパニオンオブジェクトのapplyがファクトリメソッドとして使われるので、newと書かなくてもインスタンスを生成できる。
unapplyの説明
class Human(val name: String, val age: Int) { } object Human { def unapply(h: Human): Option[(String, Int)] = Some((h.name, h.age)) }
としておくと、以下のようにパターンマッチで使える。
val h = new Human("taro", 20) h match { case Human(name, age) => println(s"name=$name, age=$age") case _ => println("unknown") }
ケースクラス
case classを使ってあんなことやこんなことができるのは、実はapply、unapplyが自動生成されていたかららしい。case class Human(name: String, age: Int) { } val h = Human("taro", 20) h match { case Human(name, age) => println(s"name=$name, age=$age") case _ => println("unknown") }