scala 伴生类与伴生对象

82 阅读2分钟

Scala 伴生类与伴生对象:从基础概念到单例模式实践

在 Scala 编程中,伴生类与伴生对象是一组紧密关联的概念,它们不仅打破了 “私有成员不可跨作用域访问” 的常规限制,还为设计模式(如单例模式)提供了优雅的实现方式。

一、什么是伴生类与伴生对象?

在 Scala 中,伴生类伴生对象是满足以下两个条件的类与对象组合:

  1. 类和对象的名称完全相同;
  2. 二者定义在同一个源文件(同一个作用域)中。
  3. 伴生对象访问伴生类私有属性

代码如下

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)
  }
}

二、用伴生类与伴生对象实现单例模式

单例模式是设计模式中最常用的模式之一,其核心目标是确保一个类在整个程序运行期间只能创建一个实例

  1. 将伴生类的构造函数设为私有(private),禁止外部通过 new 创建实例;
  2. 在伴生对象中创建伴生类的唯一实例,并提供公共方法供外部获取该实例。

代码如下

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
  }

}