配列やコレクションを返すメソッドが、null を返すべき理由はない

以下のようなnullを返却するメソッドは使用するべきではない

private final List<Cheese> cheesesInStock = ・・・;

public Cheese[] getCheese() {
    if (cheesesInSock.size == 0) return null;
    ・・・
}

上記は、呼び出し側でのnullチェックが必要になり、パフォーマンス上の深刻な問題がないかぎり使用するべきではない。以下のようにする。

private final List<Cheese> cheesesInStock = ・・・;
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];

public Cheese[] getCheeses() {
    return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}

cheesesInStockが空の場合、新しい空配列は割当られずに、EMPTY_CHEESE_ARRAYがそのまま返却される
(空でない場合は、新しい配列が割り当てられる)

toArrayについて

  • public T toArray(T a)

リスト内のすべての要素が正しい順序で格納されている配列を返します。返される配列の実行時の型は指定された配列の型になります。指定された配列にリストが収まる場合は、その配列に返されます。それ以外の場合は、指定された配列の実行時の型とリストのサイズを使って新しい配列が割り当てられます。
指定された配列にリストが収まり、その配列にさらに余分な領域がある場合、つまり配列にリストより多くの要素がある場合、配列でコレクションの末尾に続く要素は null に設定されます。これは、リストの長さを調べるときに有用です。ただし呼び出し側で、リストに null 要素がないことがわかっている場合に限ります。


コレクションに関しては以下のメソッドにより、常に同一の空のリストが返却できる

Collection.emptyList()