Scala 伴生类与伴生对象:从基础概念到单例模式实践
在 Scala 编程中,伴生类与伴生对象是一组紧密关联的概念,它们不仅打破了 “私有成员不可跨作用域访问” 的常规限制,还为设计模式(如单例模式)提供了优雅的实现方式。
一、什么是伴生类与伴生对象?
在 Scala 中,伴生类和伴生对象是满足以下两个条件的类与对象组合:
- 类和对象的名称完全相同;
- 二者定义在同一个源文件(同一个作用域)中。
-
伴生对象访问伴生类私有属性
代码如下
package level02
object class02 {
/*
* 伴生类 和 伴生对象
* 1.类和对象的名字是一样的
* 2. 他们在同一文件夹中
*
* 特点:可以访问对方的私有(private)属性
*/
class Student() {
//private 修饰的属性,在类的外部(在当前的class之外)无法访问!
private val name:String = "小花"
}
object Student {
def sayHello(stu:Student):Unit = {
//在伴生对象中,访问伴生类的私有属性!
println(s"${stu.name}")
}
}
def main(args: Array[String]): Unit = {
val stu1 = new Student()
//stu1.name 是错误的,无法访问
Student.sayHello(stu1)
}
}
二、用伴生类与伴生对象实现单例模式
单例模式是设计模式中最常用的模式之一,其核心目标是确保一个类在整个程序运行期间只能创建一个实例。
- 将伴生类的构造函数设为私有(
private),禁止外部通过new创建实例; - 在伴生对象中创建伴生类的唯一实例,并提供公共方法供外部获取该实例。
代码如下
package level02
object class03 {
/*
* 伴生类 和 伴生对象 实现 单例模式: 一个类只能有一个对象!
*
*/
//1.让构造函数变成私有的。在类的外部,就无能通过new来创建对象了
class Student() {
//private 修饰的属性,在类的外部(在当前的class之外)无法访问!
private val name:String = "小花"
}
//2.在伴生对象中创建类的实例,并返回
object Student {
val instance = new Student() //在伴生对象中,可以访问伴生类的私有成员
def getInstance:Student = {
instance
}
}
def main(args: Array[String]): Unit = {
// val stu1 = new Student()
// val stu2 = new Student()
// val stu3 = new Student()
// val stu4 = new Student()
val stu1 = Student.getInstance
val stu2 = Student.getInstance
println(stu1 == stu2) //true
}
}