关于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/