実際には、次のような空のリストを返す方が良いですか:
return Collections.emptyList();
またはこのように:
return new ArrayList<Foo>();
それとも、返されたリストで何をしようとしているかに完全に依存していますか?
主な違いは、不変リスト、つまり要素を追加できないリストをCollections.emptyList()
返すことです。( Java 9 で導入された も同様です。)List.of()
まれに、返されたリストを変更する必要があり、適切な選択ではない場合があります。Collections.emptyList()
List.of()
不変リストを返すことは、コントラクト (ドキュメント) が明示的に別の方法で述べていない限り、まったく問題ありません (そして好ましい方法でさえあります)。
さらに、emptyList()
各呼び出しで新しいオブジェクトを作成しない場合があります。
このメソッドの実装では、呼び出しごとに個別の List オブジェクトを作成する必要はありません。この方法を使用すると、同じ名前のフィールドを使用する場合と同等のコストがかかる可能性があります。(このメソッドとは異なり、フィールドはタイプ セーフを提供しません。)
の実装はemptyList
次のようになります。
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
そのため、(空のリストを返す) メソッドが頻繁に呼び出される場合、このアプローチにより、CPU とメモリの両方のパフォーマンスがわずかに向上する可能性があります。
Java 5.0 以降では、コンテナ内の要素のタイプを指定できます。
Collections.<Foo>emptyList()
空のままの空のリストを返したい場合は、このアプローチを使用する必要があるという他の回答に同意します。
Collections.emptyList
は不変であるため、2 つのバージョンには違いがあるため、戻り値のユーザーを考慮する必要があります。
戻るnew ArrayList<Foo>
と常にオブジェクトの新しいインスタンスが作成されるため、それに関連する非常にわずかな追加コストが発生するため、 を使用する理由になる場合がありますCollections.emptyList
。読みやすいという理由だけで使用するのが好きemptyList
です。
ただし、注意してください。戻って、そのような変更を加えよCollections.emptyList()
うとすると、変更できないオブジェクトが返されるため、不変オブジェクトが返されます。add()
UnsupportedOperationException()
Collections.emptyList()
返されたリストが変更されていないCollections.emptyList()
場合 (リストは不変であるため)、それ以外の場合はオプション 2 を使用します。
の利点Collections.emptyList()
は、毎回同じ静的インスタンスが返されるため、呼び出しごとにインスタンスが作成されないことです。
emptyList()
与えられた答えは、 が不変を返すという事実を強調していますが、List
代替手段を提供していません。コンストラクターのArrayList(int initialCapacity)
特殊なケースであるため、代わりに0
返すことも実行可能な解決策になる可能性があります。new ArrayList<>(0)
new ArrayList<>()
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
[...]
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
(Java 1.8.0_72 からのソース)
Collections.emptyList()
返されたリストが変更されないようにする場合に使用します。
これは、呼び出し時に返されるものですemptyList()
:
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new EmptyList();