Null Object Pattern

Null Object Pattern 또는 Null Object라고 하는 것은 NullReference를 방지하기 위해서 더미(?) 객체를 미리 만들어 넣고 기능을 제공하는 핸들러에 바인딩 되어 있는 타입의 객체(실 기능 구현 객체)가 널인지를 체크해서 NullPointerException을 방지하기 위한 패턴이다. 마틴 파울러님의 Introduce Null Object에서도 동일한 내용이 나온다.

글로 설명하는 것보다, 코드로 보면 명확하게 알 수 있다. 이 예제에서 핵심은 아래의 코드이다.

/**
* return logger
* @return
*/

public ILogger getLogger() {
  if(this.logger == null)
    return NullLogger.getInstance();

  return this.logger;
}

아래는 로그를 남기는 예제코드입니다.

package net.sjava.patterns.nullobject;
/**
*
* @author <a href="mailto:mcsong@gmail.com">mcsong@gmail.com</a>
* @since 2009. 9. 17.
*/

public interface ILogger {
/**
*
* @param log
*/
public void log(String log);
}

package net.sjava.patterns.nullobject;
/**
*
* @author <a href="mailto:mcsong@gmail.com">mcsong@gmail.com</a>
* @since 2009. 9. 17.
*/
public class FileLogger implements ILogger {

  @Override
  public void log(String log) {
    System.out.println("file log - " + log);
  }
}
package net.sjava.patterns.nullobject;
/**
*
* @author <a href="mailto:mcsong@gmail.com">mcsong@gmail.com</a>
* @since 2009. 9. 17.
*/
public class NullLogger implements ILogger {
  /**
  * singleton instance
  */
  private static final NullLogger instance = new NullLogger();
  /**
  *
  */
  private NullLogger() {
  }

  /**
  * return singleton instance
  * @return
  */
  public static NullLogger getInstance() {
    return NullLogger.instance;
  }

  @Override
  public void log(String log) {
    System.out.println("null log - " + log);
  }
}

</div>


<pre class="brush: java; gutter: true; auto-links: false">
package net.sjava.patterns.nullobject;
/**
*
* @author <a href="mailto:mcsong@gmail.com">mcsong@gmail.com</a>
* @since 2009. 9. 17.
*/
public class SocketLogger implements ILogger {

  @Override
  public void log(String log) {
    System.out.println("socket log - " + log);
  }
}
package net.sjava.patterns.nullobject;
/**
*
* @author <a href="mailto:mcsong@gmail.com">mcsong@gmail.com</a>
* @since 2009. 9. 17.
*/
public class LoggerHandler {

  /**
  * type
  */
  private ILogger logger;

  /**
  * constructor
  * @param logger
  */
  public LoggerHandler(ILogger logger) {
    this.logger = logger;
  }

  /**
  * return logger
  * @return
  */
  public ILogger getLogger() {
    if(this.logger == null)
      return NullLogger.getInstance();
    
    return this.logger;
  }

  /**
  *
  * @param log
  */
  public void log(String log) {
    this.getLogger().log(log);
  }

  /**
  *
  * @param logger
  * @param log
  */
  public void log(ILogger logger, String log) {
    this.logger = logger;
    this.log(log);
  }
}
import net.sjava.patterns.nullobject.FileLogger;
import net.sjava.patterns.nullobject.SocketLogger;
import net.sjava.patterns.nullobject.LoggerHandler;public class NullObjectTest {
  /**
  * handler
  */
  private static LoggerHandler handler;

  /**
  * @param args
  */
  public static void main(String[] args) {
    handler = new LoggerHandler(null);
    handler.log("fileloggger");
    handler = new LoggerHandler(new FileLogger());
    handler.log("socketloggger");
    handler = new LoggerHandler(new SocketLogger());
    handler.log("socketloggger");
  }
}

160BCA214AB1F47908EC13.zip

Null Object Pattern”에 대한 3개의 생각

  1. 핑백: 딱딱하고 재미없게 살아가기

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.