デザインパターン[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パターンを使うことで、
非常にエレガントでムダのないコードを記述することが可能だ。