空のマップを作成する必要があります。 型の安全性を:Javaで空のマップを作成する最も良い方法
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
問題は、上記のコードは、この警告を生成することで、チェックは
この空のマップを作成するための最良の方法は何をHashMapのために地図からキャスト?
空のマップを作成する必要があります。 型の安全性を:Javaで空のマップを作成する最も良い方法
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
問題は、上記のコードは、この警告を生成することで、チェックは
この空のマップを作成するための最良の方法は何をHashMapのために地図からキャスト?
1)地図は不変することができた場合:
Collections.emptyMap();
// or, in some cases:
Collections.<String, String>emptyMap();
あなたにコンパイラがどのようなマップが必要なのかを自動的に知ることができないときは、後者を使う必要があります(これはtype inference)。あなたがする必要がある場合は)
foobar(Collections.emptyMap()); // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine
2:
public void foobar(Map<String, String> map){ ... }
それに直接空の地図を渡すとき、あなたはタイプについて明示的にする必要があります。たとえば、メソッドは、このように宣言を検討
new HashMap<String, String>();
:例えば、その後、マップを変更することができます
補遺:あなたのプロジェクトがGuavaを使用している場合、あなたは以下の選択肢があります。
1)不変マップ:Collections.emptyMap()
に比べ
ImmutableMap.of();
// or:
ImmutableMap.<String, String>of();
、ここには大きなメリット。 From the Javadoc:
このマップの動作と、
Collections.emptyMap()
と同等 を行い、主にあなたの コードの整合性と保守性のために好ましいです。あなたが変更することができ
2)地図:
Maps.newHashMap();
// or:
Maps.<String, String>newHashMap();
Maps
は、TreeMap
やLinkedHashMap
として、同様のマップの他のタイプをインスタンス化するための同様のファクトリメソッドが含まれています。セットのために同様に
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()
}
}
}
:多くの場合、空のマップがnullで安全な設計に使用されているので
ほとんどの場合、型推論の仕事(つまり、map = Collections.emptyMap()が働きます) –
うん、そうです。私はもう少し包括的に答えを編集しました。 – Jonik
あなたはHashMapのインスタンスが必要な場合は、最良の方法は次のとおりです。
fileParameters = new HashMap<String,String>();
地図インタフェースであるので、あなたは空のインスタンスを作成したい場合は、それをインスタンス化し、いくつかのクラスを選択する必要があります。 HashMapは他のものと同じくらい良いと思われるので、それを使ってください。
どちらかCollections.emptyMap()
、または型推論は、あなたのケースでは動作しない場合は、
Collections.<String, String>emptyMap()
:
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();
}
}
}
このように作成された空のマップは変更できません。 – javashlook
、あなたはnullToEmpty
ユーティリティメソッドを利用することができますについてどう
fileParametersの宣言された型は何ですか? – jjnguy
おそらくClassCastExceptionが発生します。 –
fileParametersはMapであり、HashMapではありません。 –