水一期

25 阅读2分钟
package level02

object class03 {
  /*
   * apply
   * apply方法写在伴生对象中,可以在创建对象的时候,省略new关键字
   *
   * val 对象 = 伴生类() <===== 伴生对象.apply()
   */

  class Person() {

  }

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

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

    println(p1)
    println(p2)
    println(p1 == p2) // false
  }
}

image.png

package level02

object class04 {
  /*
   * apply
   * apply方法写在伴生对象中,可以在创建对象的时候,省略new关键字
   * 实现单例模式
   * 在伴生对象中 创建一个对象,在apply方法中返回它
   */
  class Person() {
    println("主构造器被调用......")
  }

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

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

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

image.png

object class05 {
  /*
   * apply
   * apply方法写在伴生对象中,可以在创建对象的时候,省略new关键字
   * 实现单例模式
   * 在伴生对象中 创建一个对象,在apply方法中返回它
   */
  class Person() {
    println("主构造器被调用......")
  }

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

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

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

image.png

package level02

object class04 {
  /*
   * 实现一个日志类: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("2008-11-4 09:00:03 Scala课程")
    logger2.log("2008-11-5 10:00:03 Scala课程")
  }
}

image.png

package level02

object class04 {
  /*
   * 实现一个日志类:Logger
   * 1. 把一些操作信息写入到文本文件中。
   * 2. 实现单例模式
  * */
  import java.io.FileWriter // 需导入FileWriter类

  class Logger(filename: String) {
    def log(content: String): Unit = {
      // 把内容写入一个文件
      val writer = new FileWriter(filename, true)
      writer.write(content + "\n")
      writer.close()
      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("2005-11-4 09:00:03 上scala课")
    logger1.log("2005-11-5 09:00:03 运动会")
    logger1.log("2005-11-6 09:00:03 休息")
  }
}

image.png