scala中类(日志类)

49 阅读2分钟

前面我们学习单例对象、伴生对象和伴生类,并通过他们实现了单例模式,今天我们将一步改进代码,实现完成的更标准的单例模式,并实现一个日志类。

(一) apply的基本使用

  • 在 Scala 中,apply 方法放在类的伴生对象(object)里,主要起到 工厂方法的作用,能够让使用者在创建该类实例时省去显式的 new 关键字,并且可以通过重载提供多种构造方式
  • 当写ClassName(arg1,arg2)时,编译器会自动翻译ClassName.apply(arg1,arg2),这可以让实例化代码更简单

eg1:

package level02

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

     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

     }
}

(二)apply实现单例模式

在上面的基础代码中,我们产生的对象还是在apply中通过new构造出来的,这样的话,如果我们多次生成对象,则得到的对象还是各不相同的。

eg2:

package level02

object bass114 {
     /*
    *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) //ture

     }
}

(三)案例-日志类

package level02

object basss123 {


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

     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")
          logger1.log("2005-11-4 09:06:03 Scala课")
          logger2.log("2005-11-5 09:06:03 运动会")
     }


}

(四)案例-改进日志类

接下来,我们去实现文件的创建和写入功能。这里需要用java.io.FileWriter类。我们通过这个类来创建一个writer对象,来将具体的日志内容写入指定的文件。

import java.io.FileWriter

object basss123 {
     /*
     实现一个日志类:Logger
     1.把一些操作信息写入到文本文件中,
     2.实现单例模式
      */
     class Logger(filename:String) {
          def log(content:String):Unit={ // 把内容写入到一个文件中
               val writer = new FileWriter(filename,true)// filename文件名 FileWriter  导入使用 java.io.FileWriter
               writer.write(content + "\n") // 写入换行
               writer.close() //关掉文件
               println(s"${content}")
          }
     }
     object Logger {
          var instance:Option[Logger] = None // 可选的,这个instance 可能是None ,也可能是Logger
          def apply(filename:String):Logger={
               if(instance.isEmpty){                    //判断这个单例对象是否生成
                    instance = Some(new Logger(filename))
               }
               instance.get // 获取到具体对象。如果为None,也不会报错
          }
     }

     def main(args:Array[String]):Unit = {
          val logger1= Logger("test.log")
          //   val logger2= Logger("test.log")
          //   println(logger2 == logger1)
          logger1.log("2005-11-4 09:06:03 上Scala课" )
          logger1.log("2005-11-5 09:06:03 运动会" )
          logger1.log("2005-11-6 09:06:03 休息" )
     }
}
  • 完结撒花 !!!!!!!!!!
  • 制作不易 希望·一键三连 在此感谢关注的粉丝宝宝
  • 新来的宝宝可以关注下主播哟!!!!!