142

空のマップを作成する必要があります。

if (fileParameters == null)
    fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;

問題は、上記のコードが次の警告を生成することです: Type safety: Unchecked cast from Map to HashMap

この空のマップを作成する最善の方法は何ですか?

4

7 に答える 7

284

1) Map が不変の場合:

Collections.emptyMap()

// or, in some cases:
Collections.<String, String>emptyMap()

コンパイラが必要な Map の種類を自動的に判断できない場合は、後者を使用する必要があります (これはtype inferenceと呼ばれます)。たとえば、次のように宣言されたメソッドを考えてみます。

public void foobar(Map<String, String> map){ ... }

空の Map を直接渡すときは、型を明示する必要があります。

foobar(Collections.emptyMap());                 // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine

2)マップを変更できるようにする必要がある場合は、たとえば次のようにします。

new HashMap<String, String>()

tehblanxが指摘したように


補遺: プロジェクトでGuavaを使用している場合、次の代替手段があります。

1)不変のマップ:

ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()

確かに、ここでは に比べて大きなメリットはありませんCollections.emptyMap()Javadoc から:

このマップは、 と同等の動作とパフォーマンスを示しCollections.emptyMap()ます。主に、コードの一貫性と保守性のために推奨されます。

2)変更できるマップ:

Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()

MapsTreeMapやなど、他のタイプのマップをインスタンス化するための同様のファクトリ メソッドも含まれていますLinkedHashMap


更新 (2018) : Java 9以降では、不変の空のマップを作成するための最短のコードは次のとおりです。

Map.of()

... JEP 269の新しい便利なファクトリ メソッドを使用します。

于 2009-03-11T20:10:49.347 に答える
21

Collections.emptyMap()

于 2009-03-11T20:08:43.923 に答える
15

Collections クラスの emptyMap メソッド

于 2009-03-11T20:08:42.177 に答える
10

HashMap のインスタンスが必要な場合、最善の方法は次のとおりです。

fileParameters = new HashMap<String,String>();

Map はインターフェースであるため、空のインスタンスを作成する場合は、Map をインスタンス化するクラスを選択する必要があります。HashMap は他のものと同じように優れているように見えるので、それを使用してください。

于 2009-03-11T20:07:16.877 に答える
7

のいずれかCollections.emptyMap()、またはあなたのケースで型推論が機能しない場合は、
Collections.<String, String>emptyMap()

于 2009-03-11T20:10:27.180 に答える
2

多くの場合、null セーフ設計には空のマップが使用されるため、次のnullToEmptyユーティリティ メソッドを利用できます。

class MapUtils {

  static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) {
    if (map != null) {
      return map;
    } else {
       return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of()
    }
  }

}  

セットについても同様:

class SetUtils {

  static <T> Set<T> nullToEmpty(Set<T> set) {
    if (set != null) {
      return set;
    } else {
      return Collections.<T>emptySet();
    }
  }

}

およびリスト:

class ListUtils {

  static <T> List<T> nullToEmpty(List<T> list) {
    if (list != null) {
      return list;
    } else {
      return Collections.<T>emptyList();
    }
  }

}
于 2012-04-14T15:44:24.090 に答える