私は、以下を使用してリストの新しいインスタンスを作成することの違いを理解しようとしていました。
new ArrayList<X>
と
Collections.emptyList();
私が理解したように、後者は不変のリストを返します。つまり、追加、削除、または変更することはできません。なぜ不変のemptyListを作成するのか知りたいですか?用途は何ですか?ありがとう
私は、以下を使用してリストの新しいインスタンスを作成することの違いを理解しようとしていました。
new ArrayList<X>
と
Collections.emptyList();
私が理解したように、後者は不変のリストを返します。つまり、追加、削除、または変更することはできません。なぜ不変のemptyListを作成するのか知りたいですか?用途は何ですか?ありがとう
不変であるため、再利用可能なインスタンスが可能になります。
Collections.emptyListは、常にまったく同じシングルトンインスタンスを返します。
これは非常に効率的です。
それに加えて、不変のデータはスレッド間で安全に共有でき、コーディングエラーによる奇妙な副作用を回避することが保証されています。そのため、防御コピーも不要になります。
コレクションを返す必要があり、毎回いくつかのオブジェクトを作成したくないとします。
interface Configurable {
List<String> getConfigurationList();
}
// class which doesn't have any configuration
class SimpleConfigurable implements Configurable {
public List<String> getConfigurationList() { return Collections.emptyList(); }
}
多くの場合、空のコレクションを返す方が、返すよりも望ましいです。null
私はしばしば空のリストをNullオブジェクトとして使用します。これにより、をチェックする必要がなくなりますnull
。
私はCollections.emptyList
リストを返すメソッドに使用しましたが、意味をなさない引数で呼び出されます。
たとえば、おそらく日付に基づいて、ストリームのさまざまな部分にアクセスしたいストリーム処理アプリケーション。ストリームからアイテムの期間を照会しますが、その期間にアイテムがない場合は、空のリストを返します。クエリに問題はないので、例外をスローしても意味がありません。すべての呼び出し元のコードがをチェックする必要があるため、戻るnull
こともあまり意味がありませんnull
。
不変の空のリストを返すことで、呼び出し元のコードが戻り値を適切に処理できるようになります。不変のリストは本質的にスレッドセーフであるため、スレッドの問題について心配する必要はありません。
不要なNullPointerExceptionを回避するため。
コードでは、nullを返す代わりに、通常の「空の」ArrayListを返すことができます。ただし、そのようにして、実行ごとに新しいオブジェクト(デフォルトの容量は10)を作成し続けることになります。これは、メモリ効率の高いアプローチではありません。その代わりに、emptyListを返すと、すべての呼び出しで同じインスタンスが返されます。このようにして、より効率的な方法で不要なNullPointerExceptionからあなたを救います。emptyListのJavadocからの抜粋は次のとおりです。
/**
* Returns the empty list (immutable). This list is serializable.
*
* <p>This example illustrates the type-safe way to obtain an empty list:
* <pre>
* List<String> s = Collections.emptyList();
* </pre>
* Implementation note: Implementations of this method need not
* create a separate <tt>List</tt> object for each call. Using this
* method is likely to have comparable cost to using the like-named
* field. (Unlike this method, the field does not provide type safety.)
*
* @see #EMPTY_LIST
* @since 1.5
*/