Scala 3 — Book

单例对象

Language

在 Scala 中,object 关键字创建一个单例对象。 换句话说,对象定义了一个只有一个实例的类。

对象有多种用途:

  • 它们用于创建实用程序方法的集合。
  • 伴生对象 与一个类同名二者在同一个文件里。 在此情况下,该类也称为 伴生类
  • 它们用于实现 traits,再用 traits 来创建 模块

“实用工具”方法

因为 object 是单例,所以它的方法可以像 Java 类中的 static 方法一样被访问。 例如,此 StringUtils 对象包含一个与字符串相关的方法的小型集合:

object StringUtils {
  def isNullOrEmpty(s: String): Boolean = s == null || s.trim.isEmpty
  def leftTrim(s: String): String = s.replaceAll("^\\s+", "")
  def rightTrim(s: String): String = s.replaceAll("\\s+$", "")
}
object StringUtils:
  def isNullOrEmpty(s: String): Boolean = s == null || s.trim.isEmpty
  def leftTrim(s: String): String = s.replaceAll("^\\s+", "")
  def rightTrim(s: String): String = s.replaceAll("\\s+$", "")

由于 StringUtils 是一个单例,因此可以直接在对象上调用其方法:

val x = StringUtils.isNullOrEmpty("")    // true
val x = StringUtils.isNullOrEmpty("a")   // false

伴生对象

伴生类或对象可以访问其伙伴的私有成员。 对不特定于伴生类实例的方法和值使用伴生对象。

此示例演示了伴生类中的 area 方法如何访问其伴生对象中的私有 calculateArea 方法:

import scala.math._

class Circle(radius: Double) {
  import Circle._
  def area: Double = calculateArea(radius)
}

object Circle {
  private def calculateArea(radius: Double): Double =
    Pi * pow(radius, 2.0)
}

val circle1 = new Circle(5.0)
circle1.area   // Double = 78.53981633974483
import scala.math.*

class Circle(radius: Double):
  import Circle.*
  def area: Double = calculateArea(radius)

object Circle:
  private def calculateArea(radius: Double): Double =
    Pi * pow(radius, 2.0)

val circle1 = Circle(5.0)
circle1.area   // Double = 78.53981633974483

从 traits 创建模块

对象还可用于实现创建模块的 trait。 这种技术需要两个traits,并将它们结合起来创建一个具体的 object

trait AddService {
  def add(a: Int, b: Int) = a + b
}

trait MultiplyService {
  def multiply(a: Int, b: Int) = a * b
}

// implement those traits as a concrete object
object MathService extends AddService with MultiplyService

// use the object
import MathService._
println(add(1,1))        // 2
println(multiply(2,2))   // 4
trait AddService:
  def add(a: Int, b: Int) = a + b

trait MultiplyService:
  def multiply(a: Int, b: Int) = a * b

// implement those traits as a concrete object
object MathService extends AddService, MultiplyService

// use the object
import MathService.*
println(add(1,1))        // 2
println(multiply(2,2))   // 4

Contributors to this page: