04-scala的构造器和提取器

66 阅读1分钟

构造器

构造器类似于构造函数,但是功能比构造函数更强大,构造器基本的使用方式:

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")
    }
  }
}