如果我有一个类,我想接受一个可选的记录器来记录调试信息:
public class A {
private Logger logger ;
public A( Logger logger ) {
this.logger = logger ;
}
public A() {
this( null ) ;
}
public void hello() {
logger.debug( "hello" ) ;
}
public void goodbye() {
logger.warn( "goodbye" ) ;
}
}
我有什么方法可以避免需要进行常量空值检查吗?
public void hello() {
if( logger != null ) {
logger.debug( "hello" ) ;
}
}
public void goodbye() {
if( logger != null ) {
logger.warn( "goodbye" ) ;
}
}
我想也许如果我创建了一个logger包装器类,可以对我进行检查,然后不做任何事情,或者记录消息。但是我需要包装我想要使用的每个方法。
答案 0 :(得分:9)
我会创建Logger
作为接口并实现真正的记录器和不记录任何内容的虚拟类。这样,您可以随时访问记录器而无需进行任何空检查。
答案 1 :(得分:4)
所有答案基本上建议使用空对象模式,请参阅:
答案 2 :(得分:2)
这样的事情可能是:
private void logDebug(final String str, final Object ... parameters ) {
if (this.logger != null && this.logger.isDebugEnabled()) {
this.logger.debug(
parameters.length > 0
? MessageFormat.format(str, parameters)
: str
);
}
}
private void logInfo(final String str,final Object ... parameters) {
if (this.logger != null && this.logger.isInfoEnabled()) {
this.logger.info(
parameters.length > 0
? MessageFormat.format(str, parameters)
: str
);
}
}
现在您只需拨打logDebug(str)
或logInfo(str)
,您也可以使用MessageFormat.format()
插入包含参数的日志消息:
logDebug("Called {0} method with parameters {1} and {2}","doStuff",foo,bar);
答案 3 :(得分:2)
2件事:
答案 4 :(得分:1)
抱歉,如果它听起来很愚蠢,但不会让方法Warn和Debug静态解决这个问题? 如果你需要一个实例,只需在静态方法中创建它,或者如果它的单例在静态方法中检查forr为null。
答案 5 :(得分:0)
您可以在1参数构造函数中将布尔“enableLogging”设置为true,并在空构造函数中将其设置为false。因此,您为支票赋予了更多的意义 - 而且它们更快。
答案 6 :(得分:0)
主要问题是你到处都使用null,这意味着你需要在任何地方测试null。创建一个Logger,其中所有方法都不执行任何操作,并在适当的位置使用该实例。