我的Java Web应用程序中有许多包.在其中一些我使用这个结构:
public class Foo {
private static Logger logger = LoggerFactory.getLogger("com.XXX");
public void bar() {
Foo.logger.debug("Method bar() was just called");
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这只是一个例子.一切正常,但我不喜欢许多类中记录器初始化的想法.这是一个明显的代码重复.我想将它移动到一个帮助类,让所有其他类访问它.这是一个正确的想法吗?或者也许还有其他"最佳实践"或模式?
说这是代码重复,就像说import java.util.*
你的75%的类是代码重复.或者你发现自己public class ...
经常写作.这不是重复逻辑.它是复制样板代码.
代码重复只涉及复制逻辑时的设计气味.如果有太多的样板代码,那真的是一种语言设计的味道.你真的不应该担心什么.
在缺点方面,如果放弃层级结构,则无法微调日志记录.
小智 5
如果你使用集中的全局静态记录器constrcut而不是常见的Log4J调用/ inits,我认为你不会赢得任何东西.
如果你写
private static Logger logger = LoggerFactory.getLogger("com.XXX");
logger.info("Hello World");
Run Code Online (Sandbox Code Playgroud)
或类似的东西
GlobalLogger.info(this, "LogMessage"); //Singleton...
Run Code Online (Sandbox Code Playgroud)
...不会让你的代码更"可读".
您可以编写自己的实用程序类,它包装全局记录器并实现记录器方法的静态委托。然后只需静态导入此类:
public class MyLogger {
private static Logger logger = LoggerFactory.getLogger("application");
public static void debug(String s) {logger.debug(s));}
public static void debug(Class<?> caller, String s) {
LoggerFactory.getLogger(caller.getName()).debug(s);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
用法:
import static MyLogger.*;
public class Foo {
public void bar() {
// makes use of static import!
debug("Method bar() was just called");
debug(this.getClass(), "Method bar() was just called");
}
}
Run Code Online (Sandbox Code Playgroud)
添加了示例debug
委托的重载版本,该委托采用类对象并使用适当的记录器。
归档时间: |
|
查看次数: |
1048 次 |
最近记录: |