继承 Java 中的属性。新实例?

Inheriting attributes in Java. New instance?

一个关于继承的非常简单的问题 java:

我的文摘超class(只有相关内容):

public abstract class Writer {

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    public Logger getLog() {
        return log;
    }
}

我的一个子 classes:

public class ConcreteWriter extends Writer {

    public void write1(){
      getLog().error("msg1");
      getLog().info("msg2");
      getLog().warn("msg3");
      getLog().error("msg4");
    }
}

如您所见,每次我需要写一条消息时都会重复 'getLog()',我认为这不是 "elegant",而且可能效率也不高。

不想破坏面向对象编程的封装原则,所以拒绝在superclass中使用访问修饰符'protected'(直接使用"log"变量)。

你怎么看?最好在 subclass 中创建我的日志的新实例?或类似这样的内容:

public class ConcreteWriter extends Writer {

    private final Logger log = getLog();

    public void write1(){
      log.error("msg1");
      log.info("msg2");
      log.warn("msg3");
      log.error("msg4");
    }
}

拥有两个始终具有相同值的独立字段对我来说似乎是一个非常糟糕的主意。您在逻辑上没有两个不同的状态,那么为什么要有两个单独的字段呢?相反,只需在 write1 中使用局部变量即可避免多次 getLog() 调用:

public void write1(){
  Logger log = getLog();
  log.error("msg1");
  log.info("msg2");
  log.warn("msg3");
  log.error("msg4");
}

对于具体 的日志记录,我倾向于每个 class 有一个私有静态最终字段,而不是在其他任何地方公开它。您不太可能每个实例都需要不同的记录器,在我看来,记录通常应被视为实现细节而不是 API 的一部分。

所以我会:

public class Writer {
    private static final Logger LOG = ...;

    // Use LOG when I need to
}

public class ExtendedWriter extends Writer {
    private static final Logger LOG = ...;

    // Use LOG when I need to
}