shu*_*iar 52 java inheritance logging abstract-class
我正在开发一个项目,目前正在使用log4j实现一些日志记录,我很好奇我应该如何实现日志.我正在讨论的两个实现如下:
第一选择
对于该类和所有子类,使用来自超类的单个日志:
public abstract class AbstractFoo {
protected static Log LOG = LogFactory.getLog(AbstractFoo.class);
...
}
public class Foo extends AbstractFoo {
public void someMethod() {
LOG.info("Using abstract log");
}
}
Run Code Online (Sandbox Code Playgroud)
第二选择
为每个类,super和subs使用单独的日志:
public abstract class AbstractFoo {
private static Log LOG = LogFactory.getLog(AbstractFoo.class);
...
}
public class Foo extends AbstractFoo {
private static Log LOG = LogFactory.getLog(Foo.class);
public void someMethod() {
LOG.info("Using own log");
}
}
Run Code Online (Sandbox Code Playgroud)
什么更有意义,为什么?
Pet*_*rey 91
我也不愿意.相反,我会在两种情况下都使用正确的类.
public abstract class AbstractFoo {
protected final Log log = LogFactory.getLog(getClass());
...
}
public class Foo extends AbstractFoo {
public void someMethod() {
log.info("Using abstract log");
}
}
Run Code Online (Sandbox Code Playgroud)
如果你没有进行大量的日志记录(无论如何这是一个好主意),你可以使用一种方法.
public abstract class AbstractFoo {
protected Log log() { return LogFactory.getLog(getClass()); }
...
}
Run Code Online (Sandbox Code Playgroud)
如果有一个类调用了很多,你可以覆盖它以给你一个缓存的实例.
n1c*_*r4m 12
这是我的解决方案(最终静态记录器):
public abstract class AbstractFoo {
protected abstract Log getLogger();
public doSomething() {
getLogger().info("log something");
}
}
public class Foo extends AbstractFoo {
private static final Log log = Log.getLogger(Foo.class);
protected Log getLogger() {
return log;
}
public doSomethingElse() {
log.info("log somethingElse");
}
}
Run Code Online (Sandbox Code Playgroud)
两者都有道理。这取决于您的应用程序。
我认为,更常用的做法是为每个班级使用私人记录器。这使您可以配置每个类和每个程序包的日志记录。请记住,AbstractFoo
并Foo
可能属于不同的包,可能你想看到的日志Foo
只。
此外,如果您想编写protected
字段,请三思而后行。这不是完全禁止的,而是众所周知的坏习惯。它使您的代码可读性较差,难以维护。
归档时间: |
|
查看次数: |
29435 次 |
最近记录: |