scala中的单例对象和伴生类

61 阅读1分钟

1.单例对象

/*
*创建对象的方式
* 1.class -> new
* 2.直接通过object来定义(单例对象,只有一个,孤单)
*   适用了数据存储,提供一些工具方法,公用方法......
 */
object Class07 {

  object Myschool {
    val name:String = "xxx学院"

    def say(): Unit = {
      println(s"say:${name}")
    }
  }


  def main(args:Array[String]): Unit = {
//对象名.属性名
    Myschool.name
//对象名.方法名()
 Myschool.say()
  }
}

2.伴生类和伴生对象

/*
*
* 类(class)和对象(object)同名,且在同一文件中,此时,它们互为伴生关系
*
*伴生类,伴生对象
*
* 特点:可以相互访问对方的 私有(private)成员
*
 */
object Class08 {

 class Student(private val password:String) {
   def validatePassword(input:String):Boolean = {
     input == password
   }
 }

  object Student {
    def check(stu:Student, pwd:String):Boolean = {
      //在伴生对象的内部,可以访问类的private成员
      stu.validatePassword(pwd)
    }
  }

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

    val stu1 = new Student("12345")

    if(Student.check(stu1,"12345")) {
      println("验证通过!")
    }
    //在类的外部,无法访问类的private成员
    //if(stu1.validatePassword("12345")
    //  println("验证通过!")
  }
}

3.应用-单例模式(一个类只能有一个对象)

/*
*
*单例模式:一个类(class)只能有一个对象!
*
*new 会自动调用构造函数
*步骤:
* 1.不让它new,把构造函数设置为私有的!
* 2.在伴生对象中调用new来生成一个对象;提供一个方法来获取这个对象
*
*
 */
object Class09 {

  //添加了private之后,构造函数在类的外部就不可访问!
  class Student(var name:String,var age:Int) {

  }

  object Student {
    //在伴生对象中,可以访问伴生类中的私有成员
    val ins = new Student("小花",18)
    def getInstance:Student = ins
  }

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

//    val stu1 = new Student("小花",18)
//    val stu2 = new Student("小花",19)

    val stu1 = Student.getInstance
    val stu2 = Student.getInstance

    println(stu1 == stu2)
  }
}