apply的基本使用

46 阅读1分钟

apply的基本使用

/*
apply
  apply方法在伴生对象中,可以创建对象的时候,省略new关键字

    val对象 = 伴生类() <===>  伴生对象.apply()
 */


class Person() {


}

object Person {
  def apply():Person = {
    println("apply .......")
    new Person()
  }
}

def main(args: Array[String]): Unit = {
  // 创建一个类的对象
  // val p1 = newPerson()
  val p1 = Person()
  val p2 = Person()

  println(p1)
  println(p2)
  println(p1 == p2)

实现单例模式

/*
apply
  apply方法在伴生对象中,可以创建对象的时候,省略new关键字
  实现单例模式
     在伴生对象中 创建一个对象,zaiapply方法中返回它

    val对象 = 伴生类() <===>  伴生对象.apply()
 */
class Person() {
  println("主构造器被调用......")

}

object Person {
  val p = new Person()
  def apply():Person = {
    p
  }
}

def main(args: Array[String]): Unit = {
  // 创建一个类的对象
  // val p1 = newPerson()
  val p1 = Person()  // 自动调用apply方法
  val p2 = Person()

  println(p1)
  println(p2)
  println(p1 == p2)  // true

案例:改进日志类

实现一个日志类:logger
1.把一个操作信息写入文本文件中
2.实现单例模式
 */
class Logger(filename:String) {
  def log(content:String) :Unit = {
    println(s"${content}")
  }
}

object Logger {
  // 定一个对象
  var instance: Option[Logger] = None
  def apply(filename:String): Logger = {
    if(instance.isEmpty){
      instance = Some(new Logger(filename))
    }
    instance.get
    }
  }


def main(args: Array[String]): Unit = {
  val logger1 = Logger("test.log")
  val logger2 = Logger("test.log")
  // println(logger1 == logger2)
  logger1.log("2025-11-14 09:00:03 上海浦东")
  logger1.log("2025-11-15 09:00:03 杭州")