Scala 中的 Class、Object 的 Apply()

公西俊才
2023-12-01

concept

class和object都可以定义自己的apply()方法,类名()调用object下的apply()方法,实例对象()调用class下的apply()方法。

  • Scala不能定义静态成员,而是代之定义单例对象(singleton object)。以object关键字定义。

  • 独立对象(standalone object)
    不与伴生类共享名称的单例对象称为独立对象。它可以用在很多地方,例如作为相关功能方法的工具类,或者定义Scala应用的入口点。

  • 伴生对象(companion object)
    当单例对象与某个类共享同一个名称时,它就被称为是这个类的伴生对象(companion
    object)。类和它的伴生对象必须定义在同一个源文件中。类被称为是这个单例对象的伴生类(companion
    class)。类和它的伴生对象可以互相访问其私有成员。

在下面几个场景下可以使用Scala单例对象:

  • 作为存放工具函数或常量的地方
  • 高效地共享单个不可变实例
  • 需要使用单个实例来协调某个服务时

类和单例对象间的差别是,单例对象不带参数,而类可以。因为单例对象不是用new关键字实例化的,所以没机会传递给它实例化参数

Apply()

class ApplyTest{
  def apply()  {
    println("This is a class, apply()...")
  }
}

object ApplyTest{
  def apply() = {
    println("This is an object, apply()...")
    new ApplyTest()
  }
}

object ApplyExample {
  def main(args: Array[String]) {
    var at=ApplyTest()
    at()
  }
}

var at=ApplyTest()
这是类名(),调用的是Object下的Apply()方法,由于此时并没有创建类的对象,所以也只能调用Object下的静态方法。

at()
这是变量名(),显然调用的是Class的Apply()方法

Object apply()

对于apply方法,可以直接调用,不用对象.方法名(又名:语法糖)

package Onedayhelloscala
object TestApply {
  def apply(food:String) ={
    println("Eat"+food)
  }
}

TestApply("meat")
 类似资料: