演示一个程序错误及其修复方法

25 阅读2分钟

演示一个程序错误及其修复方法 修复方式:使用 lazy val 延迟初始化 fileWriter,使其在 filename 被初始化后再创建。

package level02

import java.io.FileWriter
import java.io.IOException

object class18 {

  // 在文件中写入日志
  trait FileLogger {
    // 抽象属性: 文件名,由子类提供
    val filename: String

    // 使用 lazy val 延迟 fileWriter 的初始化
    // 这样可以确保在 filename 被赋值之后,fileWriter 才会被创建
    lazy val fileWriter: FileWriter = new FileWriter(filename, true)

    def writeMsg(msg: String): Unit = {
      try {
        fileWriter.write(msg + "\n") // 增加换行符,使日志更清晰
        fileWriter.flush() // 建议在每次写入后刷新,确保数据及时写入文件
      } catch {
        case e: IOException => e.printStackTrace()
      }
    }

    // 提供一个关闭资源的方法
    def close(): Unit = {
      try {
        if (fileWriter != null) {
          fileWriter.close()
        }
      } catch {
        case e: IOException => e.printStackTrace()
      }
    }
  }

  class MyFileLogger extends FileLogger {
    // 为抽象字段 filename 提供具体的值
    override val filename: String = "11-26.log"
  }

  def main(args: Array[String]): Unit = {
    val fileLogger = new MyFileLogger()
    fileLogger.writeMsg("今天上午上scala课程")
    fileLogger.writeMsg("下午继续学习 trait 和类的初始化。")

    // 程序结束时关闭文件写入器,这是一个好习惯
    fileLogger.close()

    println("日志已写入文件 '11-26.log'。")
  }
}

image.png

package level02

import java.io.FileWriter

/*
演示一个程序错误
*/
object class19 {
  // 在文件中写入日志
  trait FileLogger {
    println(2)
    // 抽象属性: 文件名
    val filename: String
    lazy val fileWriter = new FileWriter(filename, true)
    def writeLog(msg: String): Unit = {
      fileWriter.write(msg)
      fileWriter.close()
    }
  }

  class MyFileLogger extends FileLogger {
    println(1)
    val filename = "11-28.log"
  }

  def main(args: Array[String]): Unit = {
    val fileLogger = new MyFileLogger()
    fileLogger.writeLog("今天上午上scala课程")
  }
}

访问权限控制1

1.公开的,不写修饰符

2.protected,保护的

在类的外部不能访问:

在子类中访问。

3.private [this]

只能被当前对象中使用

在类的内部使用

package level02
object Person {
  def test(p:Person): Unit = {
    // private 在伴生对象中可以访问!
    println(p.password)
    // private[this] 在伴生对象中不能访问的
    // println(p.money)
  }
}

class Person() {
  var name:String = "xx"; // 公开的
  protected var birthday:String = "2000-10-10"
  private var password:String="123456"
  private[this] var money:Int=100

  def t():Unit = {
    println(money)
  }
}

class Son extends Person(){
  // 2. protected在子类中可访问
  println(birthday)
  // 3. private在子类中不能访问的
  // println(password)
}

def main(args: Array[String]): Unit = {
  val p1 = new Person()
  println(p1.name)
  // 2. protected在类的外部无法访问
  // println(p1.birthday)
  new Son()
  // 3. 在伴生对象中访问 类的私有成员
  Person.test(p1)
}

image.png