Scala 3 — 书籍

单例对象

语言

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

对象有几个用途

  • 它们用于创建实用方法的集合。
  • 伴生对象是一个与它共享文件名的类同名的对象。在这种情况下,该类也称为伴生类
  • 它们用于实现特征以创建模块

“实用”方法

因为 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

从特质创建模块

对象还可以用于实现特质以创建模块。此技术采用两个特质并将其组合以创建具体 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

此页面的贡献者