ヌルオブジェクトの導入

リファクタリングより、「ヌルオブジェクトの導入」
このようなコードがあるとする

   public String getPersonName(Person person) {
        //NULL判定をして返却する値を変えている!
        if (person == null) {
            return "unknown";
        } else {
            return person.getName();
        }
    }

Personを拡張して、NULLを明示できるクラスを作成し、両者にNULL判定をさせるメソッドを持たせる また、それぞれに期待するメソッドの挙動も持たせる

public class Person {
    
    private String name;
    private int age;
    //isNullメソッドを持たせる
    public boolean isNull() {
        return false;
    }
    //Personオブジェクトを生成する際にNULLを返却するような場合には代わりにNULLオブジェクトを返却する
    static Person newNull() {
        return new NullPerson();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

//これがNULLオブジェクトを表すクラス。PersonがNULLの時を表す。
public class NullPerson extends Person{

    @Override
    public boolean isNull() {
        return true;
    }
    //適宜メソッドをオーバーライドし、NULLオブジェクトが持つべき妥当な振る舞いを持たせる
    @Override
    public String getName() {
        return "unknown";
    }
    
    @Override
    public int getAge() {
        return -1;
    }
    
}

後は呼び出し側でNULL判定文を削除する

   public String getPersonName(Person person) {
        //if文が消えた!  
        return person.getName();
    }

補足
以下のようなNULL表明ができるインターフェースを作って、実装することも一考

public interface Nullable {
    boolean isNull();
}

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)