如何避免对对象进行繁琐的空检查

时间:2011-02-07 21:32:08

标签: java null encapsulation

如果我有一个类,我想接受一个可选的记录器来记录调试信息:

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包装器类,可以对我进行检查,然后不做任何事情,或者记录消息。但是我需要包装我想要使用的每个方法。

7 个答案:

答案 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件事:

  1. 始终初始化记录器
  2. (和/或)使用一个根本没有任何东西的哨兵记录器

答案 4 :(得分:1)

抱歉,如果它听起来很愚蠢,但不会让方法Warn和Debug静态解决这个问题? 如果你需要一个实例,只需在静态方法中创建它,或者如果它的单例在静态方法中检查forr为null。

答案 5 :(得分:0)

您可以在1参数构造函数中将布尔“enableLogging”设置为true,并在空构造函数中将其设置为false。因此,您为支票赋予了更多的意义 - 而且它们更快。

答案 6 :(得分:0)

主要问题是你到处都使用null,这意味着你需要在任何地方测试null。创建一个Logger,其中所有方法都不执行任何操作,并在适当的位置使用该实例。