在 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:
Contents
- 导言
- Scala 3 特性
- 为什么是 Scala 3 ?
- Scala 的味道
- Hello, World!
- The REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 头等函数
- 单例对象
- 集合
- 上下文抽象
- 顶层定义
- 总结
- 类型初探
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 领域建模
- 函数式领域建模
- 方法
- 方法特性
- main 方法
- 总结
- 函数
- 匿名函数
- 函数变量
- Eta 扩展
- 高阶函数
- 自定义 map 函数
- 创建可以返回函数的方法
- 总结
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 总结
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数是值
- 函数式错误处理
- 总结
- 类型和类型系统
- 类型推断
- 泛型
- 相交类型
- 联合类型
- 代数数据类型
- 型变
- 不透明类型
- 结构化类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- Given 实例和 Using 语句
- 上下文绑定
- Given 导入
- 实现类型类
- 多元相等性
- 隐式转换
- 总结
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- worksheet
- 与 Java 交互
- 向 Java 开发者介绍Scala
- Scala for JavaScript Developers
- Scala for Python Developers
- 下一步去哪