デザインパターン[NullObject]

では、前回ちょっとだけ触れたNullObjectを。

NullObjectはGoFの21パターンには含まれていない。
だが、非常に有用なパターンだ。

何かの検索があったとしよう。
何も引っかからなかった時に、何を返すか?
null?それはちょっとエレガントではない。

そういう場合に用いるパターンがNullObjectだ。

ではコードで説明しよう。


public interface Charactor {
int getStatus();

Charactor NULL = new Charactor() {
public int getStatus() {
return 0;
}
}
}


今回はinterfaceの内部クラスとしてNullObjectを作成した。
別ファイルに書いてもいいのだが、NullObjectはstaticなオブジェクトでかつ、インスタンスは1つだけでよいため、この方が良いと思う。
このような場合、nullか?を判断する場合以下のようなコードになる。

if (Charactor.NULL == charactor) {
・・・
なんともエレガントだ。
何も返すものがない場合は、nullを返す代わりに、必ずCharactor.NULLを返すように実装する。
そうすると、Charactor.NULLはstaticなため、
==で比較することができる。

特に何もしないクラスであるため、
nullチェックをしないでもOKだ。

たとえば、

Itemというクラスがあるとしよう。
こいつは、ある商品をあらわすクラスだ。
商品の全てはこのクラスを継承し作られている。

Itemの合計金額を出す際に、
(どう紛れ込むかはこの際論外とする)
検索処理の中でnullが紛れ込む可能性があるとしよう。

その際にNULLの価格は0としておけば、

int sum = 0;
for (int i = 0; i < items.length; i++) {
sum = items[i].getPrice();
}

と書くことができる。 実にエレガントだ。

NullObjectパターンを使うことで、
非常にエレガントでムダのないコードを記述することが可能だ。