web-dev-qa-db-ja.com

Javaで空のマップを作成する最良の方法

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

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

問題は、上記のコードが次の警告を生成することです。タイプセーフティ:マップからHashMapへの未チェックのキャスト

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

101
JorgeO

1)マップが不変の場合:

_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()
_

Maps には、 TreeMap または LinkedHashMap


更新(2018):オンJava 9以降、最短コード不変の空のマップを作成するには、次のようにします。

_Map.of()
_

...新しい コンビニエンスファクトリメソッド from JEP 269 を使用します。 ????

207
Jonik
14
TofuBeer
14
basszero

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

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

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

9
AndreiM

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

7

多くの場合、空のマップがヌルセーフデザインに使用されるため、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();
    }
  }

}
2
1
OscarRyz