构造器
构造器类似于构造函数,但是功能比构造函数更强大,构造器基本的使用方式:
package example
class Foo {
private var name: String = ""
override def toString(): String = s"Foo[name: $name]"
}
object Foo {
def apply(name: String): Foo = {
val foo = new Foo()
foo.name = name
foo
}
}
object MyExample {
def main(args: Array[String]): Unit = {
val foo = Foo("foo")
val foo1 = Foo.apply("foo")
println(foo.toString())
println(foo1.toString())
}
}
当然,apply
方法不一定返回原来的对象,举个例子:
package example
object UniqueId {
// 注意这里返回的是String
def apply(id: String) = s"unique-id-$id"
}
object MyExample {
def main(args: Array[String]): Unit = {
val uid = UniqueId("fdjfdslklkjlk") // 类似构造函数的使用方式
println(s"uid: $uid")
}
}
代码输出:
uid: unique-id-fdjfdslklkjlk
提取器
提取器可以获取一个对象,然后返回最初创建该对象的相关方法,一般和match
配合使用,举个例子:
package example
class Person(name: String, age: Int) {
}
object Person {
def apply(name: String, age: Int): Person = new Person(name, age)
// 注意这里返回Some用于后续的match
def unapply(name: String): Option[String] = Some(name)
}
object MyExample {
def main(args: Array[String]): Unit = {
val per = Person("foo", 10)
val foo = "foo"
foo match {
// 第一个case相当于提取的name参数
case Person(name) => println(s"Person name is foo")
case _ => println("match wrong")
}
}
}