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

标签 java inheritance logging encapsulation

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

我的抽象父类(super class)(仅相关内容):

public abstract class Writer {

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

    public Logger getLog() {
        return log;
    }
}

我的子类之一:

public class ConcreteWriter extends Writer {

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

正如你所看到的,每次我需要编写消息时都会重复“getLog()”,我认为这不“优雅”,而且可能效率也不高。

我不想破坏OO编程的封装原则,所以我拒绝在父类(super class)中使用访问修饰符“protected”(直接使用“log”变量)。

你觉得怎么样?最好在子类中创建我的日志的新实例?或类似的东西:

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");
}

对于日志记录具体,我倾向于每个类都有一个私有(private)静态最终字段,而不是将其暴露在其他地方。每个实例不太可能需要不同的记录器,并且在我看来,日志记录通常应被视为实现细节而不是 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
}

关于java - Java 中的继承属性。新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31649902/

相关文章:

mysql - Java、Tomcat、MySQL 组合的安装程序

java - 短语的正则表达式包含文字和数字,但并非所有短语都是仅具有固定范围长度的数字

Java OOP 改变二维矩阵的位置?

java - 如何在 Java 中结合日志记录和单元测试?

java - 所有带@PathParam 的 Jersey 路线返回 404

java - 访问列表中的父类

objective-c - 向下转换继承函数的返回类型的好习惯

c++ - 为什么 C++ 构造函数接受不正确的类型作为参数?

仅部分考虑 Java 日志记录配置

javascript - Log4j2 路由附加器 JavaScript 配置错误