1. 什么是伴生类和伴生对象?
在 Scala 中:
- 伴生类:与伴生对象同名的类
- 伴生对象:与伴生类同名的对象,使用
object关键字定义
它们必须定义在同一个源文件中,可以互相访问彼此的私有成员。
示例:
scala
class CompanionClass {
private val classSecret = "class secret"
def accessObjectSecret: String = CompanionObject.objectSecret
}
object CompanionObject {
private val objectSecret = "object secret"
def accessClassSecret(c: CompanionClass): String = c.classSecret
}
2. 它们有什么特点?
主要特点:
- 互相访问私有成员:伴生类和伴生对象可以访问彼此的私有字段和方法
- 替代静态成员:Scala 没有
static关键字,伴生对象用于存放类的"静态"成员 - 工厂模式:常在伴生对象中定义
apply方法作为工厂方法 - 隐式转换:可以在伴生对象中定义隐式转换
应用场景:
- 工厂方法创建对象
- 定义常量
- 实现工具方法
- 单例模式实现
3. 什么是单例模式?
单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。
在 Scala 中的实现:
scala
// 使用 object 关键字直接创建单例
object Singleton {
private var count = 0
def increment(): Unit = {
count += 1
}
def getCount: Int = count
}
// 使用
Singleton.increment()
println(Singleton.getCount) // 输出:1
特点:
- 延迟加载(懒加载)
- 线程安全
- 全局唯一实例
总结
- 伴生对象 + 伴生类 = Scala 特有的组织代码方式
- object 关键字 = 天然的单例模式实现
- 伴生关系 = 打破"类与静态成员分离"的传统模式
这些特性让 Scala 在面向对象和函数式编程之间找到了很好的平衡点。