Scala单例对象(伴生对象)

概念

Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概
念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象
来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴
生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。

单例对象

基本语法

object Person{
    
     
 val country:String="China" 
} 

说明
(1)单例对象采用 object 关键字声明
(2)单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
(3)单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。

apply方法

说明

(1)通过伴生对象的 apply 方法,实现不使用 new 方法创建对象。
(2)如果想让主构造器变成私有的,可以在()之前加上 private。
(3)apply 方法可以重载。
(4)Scala 中 obj(arg)的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg)。用
以统一面向对象编程和函数式编程的风格。
(5)当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构
建对象时,调用的其实时伴生对象的 apply 方法。

案例实操

package chapter06

object Test11_Object {
    
    
  def main(args: Array[String]): Unit = {
    
    

//    val student11 = new Student11("alice",18)
//    student11.printInfo()

    val student1 = Student11.newStudent("alice",18)
    student1.printInfo()

    val student2 = Student11.apply("bob",18)
    student2.printInfo()

    //名称为aplly时候,可省略
    val student3 = Student11("bob2",18)
    student3.printInfo()
  }

}


//定义类
class Student11 private(val name: String, val age: Int){
    
    

  def printInfo(): Unit ={
    
    
    println(s"student: name=$name, age=$age, school=${Student11.school}")
  }

}
//伴生对象
object Student11{
    
    

  val school: String = "atguigu"

  //定义一个类的对象实例的创建方法
  def newStudent(name: String, age: Int): Student11 = new Student11(name, age)
  def apply(name: String, age: Int): Student11 = new Student11(name, age)
}

扩展:在 Scala 中实现单例模式的案例

package chapter06

object Test12_Singleton {
    
    

  def main(args: Array[String]): Unit = {
    
    

    val student1 = Student12.getInstance()

    student1.printInfo()
    println(student1)

    val student2 = Student12.getInstance()

    student2.printInfo()
    println(student2)


  }

}


//定义类
class Student12 private(val name: String, val age: Int){
    
    

  def printInfo(): Unit ={
    
    
    println(s"student: name=$name, age=$age, school=${Student11.school}")
  }

}

//饿汉式的单例设计模式
//伴生对象
//object Student12{
    
    
//
//  private val student: Student12 = new Student12("alice",18)
//
//  def getInstance(): Student12 = student
//
//}

//懒汉式
object Student12{
    
    

  private var student: Student12 = _

  def getInstance(): Student12 = {
    
    

    if (student == null){
    
    

      //如果没有对象实例的话就创建一个
      student = new Student12("bob",18)
    }

    student
  }
}

Guess you like

Origin blog.csdn.net/weixin_44480968/article/details/119477231