NullPointerException(ぬるぽ)はJavaプログラミングではつき物ですが、それが発生しないような手法はいくつかあると思いますが、その方法の一つに「ヌルオブジェクト」を使うという方法があります。
1 |
わかりやすいオブジェクトのNull対策しては下記のようなソースコードが挙げられますよね。 |
InputForm input = new InputForm(); InputCondition condition = input.get("太郎"); //通常のNullチェック if(condition!=null){ condition.display_name(); }
もしくは、Null及び、空文字をチェックする共通メソッドを作成されるプロジェクトもあるかもしれませんね。(というかそれが基本?)
せっかくなので、「ヌルオブジェクト」を使ってNullチェックをさせるようにしましょう。
今回ご紹介させて頂くソースコードは、図(クラス図)にすると下記のようになります。
「nulltest」は今回のパッケージ名です。
public class Main { public static void main(String[] args) { InputForm input = new InputForm(); InputCondition condition = input.get("太郎"); condition.display_name(); } }
こちらの、コードが「input.get("太郎")」であれば、「名前は太郎です。」と返し、そうでない場合は、何も表示しなくなり、NullPointerExceptionが発生しません。
public class InputForm { public InputCondition get(String name) { if(name.equals("太郎")){ return new InputCondition("太郎"); }else{ return NullInputCondition.getInstance(); } } }
public class InputCondition { //名前 private String name; //コンストラクタ public InputCondition(String name) { this.name = name; } public void display_name() { System.out.println("名前は" + name + "です。"); } }
//InputConditionを継承 public class NullInputCondition extends InputCondition{ //インスタンス生成 private static NullInputCondition nullInputCondition = new NullInputCondition(); //コンストラクタ public NullInputCondition() { super(""); } //インスタンスの取得 public static NullInputCondition getInstance() { return nullInputCondition; } //何もしない。 public void display_name() { } }
InputConditionを継承させた「NullInputCondition」というクラスを作り、「display_name()」を継承させてNullの場合は、何もしないという形で実装しています。
「ヌルオブジェクト」を使用するメリットとしては下記です。
- メインのソースコードがいちいちNullを意識しなくて済むので可読性が向上する。
ただ、デメリットとしては、下記が挙げられるでしょう。
- そもそも、実装者以外が、該当オブジェクトが「ヌルオブジェクト」があるかどうか気づかない可能性がある。
- 結局は、オブジェクト側でNullチェックをする必要がある。
オブジェクトに結局Nullチェックを書かないといけないとは言え、一つのオブジェクトに対するNullチェックが異常に多い場合等にはかなり有効になります。
Nullチェックのし忘れ防止や、そもそもめんどくさいと言った場合も、ヌルオブジェクトなら関係ないですからね。うまく使い分けましょう。
この記事へのコメントはありません。