空のマップを作成する必要があります。
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
問題は、上記のコードが次の警告を生成することです。タイプセーフティ:マップからHashMapへの未チェックのキャスト
この空のマップを作成する最良の方法は何ですか?
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 を使用します。 ????
HashMapのインスタンスが必要な場合、最良の方法は次のとおりです。
fileParameters = new HashMap<String,String>();
Mapはインターフェイスであるため、空のインスタンスを作成する場合は、Mapをインスタンス化するクラスを選択する必要があります。 HashMapは他のどの製品よりも優れていると思われるので、それを使用してください。
Collections.emptyMap()
のいずれか、または型推論がケースで機能しない場合、Collections.<String, String>emptyMap()
多くの場合、空のマップがヌルセーフデザインに使用されるため、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();
}
}
}