2012-09-26 12 views
6

可能性の重複:
Collections.emptyList() vs. new instance誰かがJavaでCollections.emptyListを使用するのはなぜですか?

私が使用して、リストの新しいインスタンスを作成するとの違いを理解しようとしていた。

new ArrayList<X> 

Collections.emptyList(); 

わかりましたが、後で不変のリストを返します。つまり、追加、削除、または変更することはできません。 なぜ私は誰が作成し、不変の空リストを知りたいですか?それは何ですか? ありがとう

+0

おそらく答えは[こちら](http://stackoverflow.com/questions/5552258/collections-emptylist-vs-new-instance) –

+2

不変性は、あなたのために良いです:ここではemptyListのJavadocからスニップです! –

答えて

13

コレクションを返す必要があり、毎回2組のオブジェクトを作成したくないとします。空のコレクションを返す

interface Configurable { 
    List<String> getConfigurationList(); 
} 

// class which doesn't have any configuration 
class SimpleConfigurable implements Configurable { 
    public List<String> getConfigurationList() { return Collections.emptyList(); } 
} 

は、多くの場合、私はリストを返すが、メソッドのCollections.emptyListは意味がありません引数で呼び出され使用しましたnull

+5

SimpleConfigurable ClassのクライアントがgetConfigurationList()によって返された空のリストに要素を追加しようとするとどうなりますか? – param

+1

彼らは例外を受け取ります。これは、おそらくあなたが 'SimpleConfigurable'のデザイナーとして望むものです。 [pure-programming](wikipedia.org/wiki/Pure_function)引数全体を言い換えると、可変オブジェクトを返す関数のセマンティクスは何ですか?誰かが戻り値に要素を追加すると、あなたのライブラリは何らかのアクションを取るでしょうか?あなたのライブラリは 'getConfigList()'の次の呼び出し元のためにインスタンスをキャッシュしますか?これをスレッドセーフにするにはどうすればいいですか?変更不可能なリストを返すと、これらの質問のそれぞれに対して非常に単純な答えが得られます。 – Groostav

+0

@Groostav unmodifiableListを返すことは、a)設計上の変更を望む場合を除き、最適です。b)パフォーマンスの問題としてプロファイルを作成しています。 –

12

再使用可能なインスタンスを許可します。

Collections.emptyListは、常に同じシングルトンインスタンスを返します。

これは非常に効率的です。

さらに、不変のデータはスレッド間で安全に共有でき、コーディングエラーによる奇妙な副作用を防ぐことが保証されています。そのため、防御コピーも不要になります。

7

よく空リストをNull objectsとして使用します。これは、nullを確認する必要はありません。

+0

しかし、どうにかしてget()を使用することさえできないのですが、その利点は何ですか?私が見つけた利点の1つは、ヌルとは逆の反復処理ができることです。 –

+0

'size()'、 'isEmpty()'のような一般的な条件付きメソッドを呼び出すことができます。 – sevenforce

5

を返すことに好適です。

たとえば、おそらく日付に基づいて、ストリームのさまざまな部分にアクセスするストリーム処理アプリケーションです。ストリームから項目の期間を照会しますが、その期間に項目がない場合は空のリストを返します。例外を投げることは、クエリに間違いがないので意味をなさないでしょう。 nullを返すことはあまり意味がありません。なぜなら、すべての呼び出しコードがnullをチェックする必要があるからです。

不変の空のリストを返すことで、呼び出しコードが戻り値をうまく処理できるようになります。不変のリストは本質的にスレッドセーフであるため、スレッドの問題を心配する必要はありません。

2

不要なNullPointerExceptionを回避します。

コードでは、nullを返す代わりに通常の「空の」ArrayListを返すことがあります。しかし、その方法では、メモリ効率の良いアプローチではない、各実行時に新しいオブジェクト(デフォルトの容量は10)を作成し続けます。その代わりにemptyListを返すと、すべての呼び出しで同じインスタンスが返されます。これにより、不要なNullPointerExceptionをより効率的に保存できます。

/** 
* Returns the empty list (immutable). This list is serializable. 
* 
* <p>This example illustrates the type-safe way to obtain an empty list: 
* <pre> 
*  List&lt;String&gt; 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 
*/ 
関連する問題