空のマップを作成する必要があります。
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
問題は、上記のコードがこの警告を生成することです: タイプセーフ:MapからHashMapへの未チェックのキャスト
この空のマップを作成する最良の方法は何ですか?
空のマップを作成する必要があります。
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
問題は、上記のコードがこの警告を生成することです: タイプセーフ:MapからHashMapへの未チェックのキャスト
この空のマップを作成する最良の方法は何ですか?
回答:
1)マップが不変である場合:
Collections.emptyMap()
// or, in some cases:
Collections.<String, String>emptyMap()
コンパイラーが必要なマップの種類を自動的に判別できない場合は、後者を使用する必要があります(これは、型推論と呼ばれます)。たとえば、次のように宣言されたメソッドについて考えます。
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>()
補遺:プロジェクトで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()
...新しい使用した便利なファクトリメソッドからJEP 269。😎
どちらかCollections.emptyMap()
、または型推論は、あなたのケースでは動作しない場合は、
Collections.<String, String>emptyMap()
多くの場合、空のマップは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();
}
}
}