Как избежать утомительных нулевых проверок на объекте - PullRequest
2 голосов
/ 08 февраля 2011

Если у меня есть класс, который я хочу принять дополнительный регистратор для записи отладочной информации:

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" ) ; 
    }

}

Я подумал, что, может быть, если я сделаю класс-оболочку логгера, он сможет выполнить проверки для меня, а затем либо ничего не делать, либо записать сообщение. Но тогда мне нужно было бы обернуть каждый метод, который я хотел бы использовать.

Ответы [ 7 ]

9 голосов
/ 08 февраля 2011

Я бы создал Logger в качестве интерфейса и реализовал бы настоящий регистратор и фиктивный класс, который ничего не регистрирует. Таким образом, вы всегда можете получить доступ к регистратору без каких-либо проверок на ноль.

4 голосов
/ 08 февраля 2011

Все ответы в основном предлагают использовать Шаблон нулевого объекта , см .:

2 голосов
/ 08 февраля 2011

2 вещи:

  1. всегда инициализировать регистратор
  2. (и / или) использовать дозорный логгер, который вообще ничего не делает
2 голосов
/ 08 февраля 2011

Примерно так:

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);
1 голос
/ 23 июля 2011

Извините, если это звучит глупо, но разве методы статики Warn и Debug не решат эту проблему? Если вам нужен экземпляр, просто создайте его внутри статических методов или если он содержит одиночную проверку на пустые значения внутри статических методов.

0 голосов
/ 08 февраля 2011

Основная проблема в том, что вы используете null везде, что означает, что вам, естественно, нужно проверять null везде. Создайте Logger, где все методы ничего не делают, и используйте этот экземпляр там, где это необходимо.

0 голосов
/ 08 февраля 2011

Вы можете установить логическое значение «enableLogging» в true в вашем конструкторе с одним параметром и в false в вашем пустом конструкторе. Таким образом, вы придаете больше значения своим чекам - и они быстрее.

...