在 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
此頁面的貢獻者
內容
- 簡介
- Scala 特色
- 為何選擇 Scala 3?
- Scala 初體驗
- Hello, World!
- REPL
- 變數和資料類型
- 控制結構
- 網域建模
- 方法
- 一級函數
- Singleton 物件
- 集合
- 脈絡抽象
- 頂層定義
- 摘要
- 初步探討類型
- 字串內插
- 控制結構
- 網域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法特色
- Scala 3 中的主要方法
- 摘要
- 函數
- 匿名函數
- 函數變數
- Eta 展開
- 高階函數
- 撰寫自己的 map 方法
- 建立會傳回函數的方法
- 摘要
- 封裝和匯入
- Scala 集合
- 集合類型
- 集合方法
- 摘要
- 函式程式設計
- 什麼是函式程式設計?
- 不可變值
- 純函數
- 函數是值
- 函式錯誤處理
- 摘要
- 類型和類型系統
- 推論類型
- 泛型
- 交集類型
- 聯集類型
- 代數資料類型
- 變異
- 不透明類型
- 結構類型
- 相依函式類型
- 其他類型
- 脈絡抽象
- 擴充方法
- 內容參數
- 內容範圍
- 已提供輸入
- 類型類別
- 多重宇宙等式
- 隱式轉換
- 摘要
- 並行
- Scala 工具
- 使用 sbt 建立和測試 Scala 專案
- 工作表
- 與 Java 互動
- Java 開發人員的 Scala
- JavaScript 開發人員的 Scala
- Python 開發人員的 Scala
- 下一步