ケアレスミスを無くす章

1.2. 配列を返すメソッド

『目的』

配列を返すメソッドを工夫してミスを減らしましょう。

『Before』

配列を返すメソッドで、返り値としてnullを返す実装はミスを誘発することになります。 よくありません。 これは、nullを返す例です。

public class Before {
    // 文字列リスト
    private List<String> stringList;

    /**
     * 文字列リストを文字列配列に変換して返す。
     */
    private String[] getStringList() {
        // リストの中身がないから null を返す
        if (stringList.size() == 0) {
            return null;
        }
        // リストの中身があるから配列に変換して返す
        return stringList.toArray(new String[stringList.size()]);
    }

    /**
     * 文字列リストに"Hello"を含むかどうかを返す。
     */
    public boolean isContainsHello() {
        String[] list = getStringList();

        if (list != null) {
            if (Arrays.asList(list).contains("Hello")) {
                return true;
            }
        }
        return false;
    }
}

getStringList()メソッドは、リストのサイズが0である場合にnullを返しますが、呼び出し側(isContainsHello)ではnullチェック用の条件文が必要になります。 うっかりnullチェックを忘れてしまい、NullPointerException例外を引き起こしてしまうかもしれません。

『After』

そこで、nullを返す代わりにサイズ0の配列を返すように書き換えてみます。

public class After {
    // 文字列リスト
    private List<String> stringList;
    /**
     * 文字列リストを文字列配列に変換して返す。
     */
    private String[] getStringList() {
        // リストの中身が有ろうが無かろうが配列に変換して返す
        return stringList.toArray(new String[stringList.size()]);
    }

    /**
     * 文字列リストに"Hello"を含むかどうかを返す。
     */
    public boolean isContainsHello() {
        String[] list = getStringList();
        if (Arrays.asList(list).contains("Hello")) {
            return true;
        }
        return false;
    }
}

呼び出し側でのnullチェック用の条件文が不要になりましたね。 ということは、NullPointerException例外が発生する危険もなくなりました。 また、配列を返すメソッド自身も簡潔になりました。

『まとめ』

配列を返すメソッドは、nullを返すことはせずにサイズ0の配列を返しましょう。 それによって、コードが簡潔になりますし、NullPointerException例外が発生しなくなります。

なお、nullを返すことによる利点は些細な点においてはあるのですが、ミスを防ぐことの方が遙かに重要です。

< 前のページへ

Pagetop