154

私が使用できる状況のいくつかは何Collections.emptyMap()ですか?ドキュメントには、コレクションを不変にしたい場合にこのメソッドを使用できると記載されています。

不変の空のコレクションが必要なのはなぜですか?ポイントは?

4

9 に答える 9

148

効果的な Javaから、 項目 #43 -"Return empty arrays or collections, not null"空のコレクションを返すことを示します。また、Collections クラスでこれらのemptyList()emptySet()、およびemptyMap()メソッドを使用して、不変であるという追加の利点もある空のコレクションを取得することを示すことさえあります。項目 #15 から "Minimize Mutability"

Collections-emptySet-Collections-emptyList-Collectionsから

プログラミングイディオムの一種です。これは、null 変数を必要としない人向けです。したがって、セットが初期化される前に、空のセットを使用できます。

注:以下のコードは単なる例です (ユースケースに応じて変更してください)。

private Set myset = Collections.emptySet();

void initSet() {
   myset = new HashSet();
}
void deleteSet() {
   myset = Collections.emptySet();
}

これらの方法には、いくつかの利点があります。

  1. コレクションのジェネリック型を明示的に入力する必要がないため、より簡潔になります。通常、メソッド呼び出しのコンテキストから推測されるだけです。

  2. 新しいオブジェクトを作成する必要がないため、より効率的です。既存の空の不変オブジェクトを再利用するだけです。この効果は一般的には非常にマイナーですが、時折 (まあ、めったに) 重要ではありません。

于 2013-02-13T05:28:40.877 に答える
33

私の個人的な経験では、API がパラメーターのコレクションを必要とするが、提供するものが何もない場合に非常に便利です。たとえば、次のような API があり、null 参照を許可しない場合があります。

public ResultSet executeQuery(String query, Map<String, Object> queryParameters);

パラメーターを取らないクエリがある場合、配列の割り当てを伴う HashMap を作成するのは確かに少し無駄です。実際には定数である「空のマップ」を実装方法で渡すことができます。でjava.util.Collections

于 2013-02-13T05:26:46.060 に答える
23

不変の空のコレクションが必要なのはなぜですか? ポイントは?

ここには、一緒に見ると奇妙に見える 2 つの異なる概念があります。2 つの概念を別々に扱うと、より理にかなっています。

  • まず、可能な限り、変更可能なコレクションではなく、変更できないコレクションを使用することをお勧めします。不変性の利点は、他の場所で十分に文書化されています

  • 次に、null を標識として使用するよりも、空のコレクションを使用することをお勧めします。これについては、こちらで詳しく説明しています。これは、コードがよりクリーンで理解しやすくなり、バグが隠れる場所が少なくなることを意味します。

そのため、マップを必要とするコードがある場合は、null ではなく空のマップを渡して、マップがないことを示すことをお勧めします。また、ほとんどの場合、マップを使用する場合は、不変のマップを使用することをお勧めします。これが、不変の空のマップを作成する便利な関数がある理由です。

于 2013-02-13T11:02:29.110 に答える
5

1 つは、参照の共有を回避できることです。などには、割り当てられたnew HashMap()オブジェクトと、場合によってはデータを保持するためのいくつかの追加要素が必要ですが、不変の空のコレクション (リスト、セット、マップ、またはその他のもの) のコピーが 1 つだけ必要です。これにより、呼び出しているメソッドがマップを受け入れる必要があるが、それを編集する必要がない場合に、明らかに選択されます。

Josh Bloch の「 Effective Java 」をチェックすることをお勧めします。これには、不変オブジェクトの非常に優れた属性 (スレッド セーフを含む) がリストされています。

于 2013-02-13T05:28:47.567 に答える
3

を返す関数があり、状況によっては返すデータがない場合に役立ちます。そのimmutable collectionため、返す代わりに返すnullことができますemptyMap()

コードを簡単にし、防止しますNullPointerException

于 2013-02-13T05:31:08.543 に答える
3

ほとんどの場合、 a を使用しconstructorて新しい を作成しますempty map。しかし、使用Collections methodsを作成するためのいくつかの利点を提供しますempty mapstatic method java.util.Collections.emptyMap()

  1. コレクションのジェネリック型を明示的に入力する必要がないため、より簡潔になります。通常、メソッド呼び出しのコンテキストから推測されるだけです。

  2. 新しいオブジェクトを作成する必要がないため、より効率的です。既存の空の不変オブジェクトを再利用するだけです。この効果は一般的には非常にマイナーですが、時折 (まあ、めったに) 重要ではありません。

于 2013-02-13T05:34:40.187 に答える
2

不変の空のコレクションが必要なのはなぜですか? ポイントは?

同じ理由Collections.unmodifiableMap()で、ある時点で使用します。ユーザーが変更を試みた場合に例外をスローする Map インスタンスを返す必要があります。これは単なる特殊なケースです: 空のマップです。

于 2013-02-13T05:28:46.540 に答える