Java:子类中父类的变量未初始化并保留 null

标签 java variables initialization parent

Parent class(*ch.qos.logback.core.FileAppender*):

     ...

   protected String fileName = null;

   public FileAppender() {
      }

          public void setFile(String file) {
            if (file == null) {
              fileName = file;
            } else {
              // Trim spaces from both ends. The users probably does not want
              // trailing spaces in file names.
              String val = file.trim();
              fileName = val;
            }
          }
    ...

子类:

    ...
   public class FileAppender<E> extends ch.qos.logback.core.FileAppender<E> {

     private FileResourceManager frm  = new FileResourceManager(fileName, tempDir, false, loggerFacade);


     public void writeOut(E event) throws IOException {
      Object txId = null;
      try {
       frm.start();
       txId = frm.generatedUniqueTxId();
       frm.startTransaction(txId);
       outputStream = frm.writeResource(txId, fileName, true);
       outputStream.write(event.toString().getBytes());
       frm.commitTransaction(txId);

      }

      catch (Exception e) {
    ...
      }
     }

问题是 fileName 在这一行中作为 null 传递给 frm:

private FileResourceManager frm  = new FileResourceManager(fileName, tempDir, false, loggerFacade);

如何创建 frm 实例,fileName 不为空,例如已经在父级中初始化了吗?

最佳答案

如果我正确理解您的问题,您可以执行以下操作之一:

  • 在子类的构造函数中调用setFile(file)
  • 在子构造函数中实现 setFile() 方法中的逻辑(顺便说一句,这将是代码重复)
  • 如果父类提供了接受文件参数的构造函数,则在子类的构造函数中使用 super(file) 调用父类的构造函数

更新

AFAIU,问题出在字段初始化顺序上。将“frm”字段初始化移动到子类构造函数中应该可以解决问题:

public FileAppender(String fileName) {
    setFile(fileName);
    frm  = new FileResourceManager(fileName, tempDir, false, loggerFacade);
    ...
}

关于Java:子类中父类的变量未初始化并保留 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4734290/

相关文章:

function - 在 Robot Framework 中返回两个值

java - 如何将双倍向下舍入到最接近的百位

c - 在 C 中创建和初始化包含函数指针的结构的正确方法是什么?

c - 初始化窗口代码 Mac OS X

java - Spring-Data-Neo4j:存储库 findAll() 方法异常 `at org.neo4j.kernel.TopLevelTransaction.markAsRollbackOnly`

java - 如何停止无尽的 EJB 3 计时器?

java - OOP 设计 : How to decide program flow and class responsible for method (JSFML library)

javascript - 忽略 Javascript 中的连字符 (Postman)

Java 变量可见性

java - 为什么 java 中 date.gettime() 总是返回上一个日期,而不是今天的日期?