要让C.run()使用自己的类记录器,我应该在B中添加一个public/protected方法getLogger()吗?
public abstract class A extends Thread {
@Override
public abstract void run();
}
public class B extends A {
private static final Logger logger = Logger.getLogger(B.class.getName());
@Override
protected void run() {
// do something
logger.info("B");
}
}
public class C extends B {
}
Run Code Online (Sandbox Code Playgroud)
pla*_*nes 12
记录器理想情况下设置为Class级别.因此,如果C需要它自己的Logger,那么在C中声明它自己的Logger,例如
private static final Logger logger = Logger.getLogger(C.class.getName());
Run Code Online (Sandbox Code Playgroud)
这样,当C运行某些代码时,它会记录到自己的Logger,当B运行时,它会记录到自己的Logger.您将能够清楚地看到哪个类以这种方式记录.
如果这不是你想要的,请用你想要实现的目标和原因扩展问题.
我不相信以下代码是否是一个好主意(我总是希望物理上运行代码的类是Logger)但它应该工作:
public abstract class A extends Thread {
@Override
public abstract void run();
protected abstract Logger getLogger();
}
public class B extends A {
private static final Logger logger = Logger.getLogger(B.class.getName());
@Override
public void run() {
getLogger().info("B");
}
@Override
protected Logger getLogger() {return logger;);
}
public class C extends B {
private static final Logger logger = Logger.getLogger(C.class.getName());
@Override
protected Logger getLogger() {return logger;);
}
Run Code Online (Sandbox Code Playgroud)
您可以在基类中使用它:
protected Logger logger = Logger.getLogger(this.getClass().getName());
Run Code Online (Sandbox Code Playgroud)
this.getClass()将使用子类名称初始化记录器。
| 归档时间: |
|
| 查看次数: |
11061 次 |
| 最近记录: |