Scala 3 — 書籍

Singleton 物件

語言

在 Scala 中,object 關鍵字會建立一個 Singleton 物件。換句話說,物件定義一個只有一個實例的類別。

物件有幾個用途

  • 它們用於建立公用方法的集合。
  • 伴隨物件是與它共用一個檔案的類別同名的物件。在這種情況下,該類別也稱為伴隨類別
  • 它們用於實作特質以建立模組

「公用」方法

由於 object 是 Singleton,因此可以像存取 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 是 Singleton,因此可以直接在物件上呼叫其方法

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

此頁面的貢獻者