2009-03-11 42 views
73

空のマップを作成する必要があります。 型の安全性を:Javaで空のマップを作成する最も良い方法

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

問題は、上記のコードは、この警告を生成することで、チェックは

この空のマップを作成するための最良の方法は何をHashMapのために地図からキャスト?

+0

fileParametersの宣言された型は何ですか? – jjnguy

+0

おそらくClassCastExceptionが発生します。 –

+1

fileParametersはMapであり、HashMapではありません。 –

答えて

143

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

tehblanx pointed outなど)

:例えば、その後、マップを変更することができます

補遺:あなたのプロジェクトが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は、TreeMapLinkedHashMapとして、同様のマップの他のタイプをインスタンス化するための同様のファクトリメソッドが含まれています。セットのために同様に

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<String, String> s = Collections.emptyMap();

+0

ほとんどの場合、型推論の仕事(つまり、map = Collections.emptyMap()が働きます) –

+0

うん、そうです。私はもう少し包括的に答えを編集しました。 – Jonik

9

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

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

地図インタフェースであるので、あなたは空のインスタンスを作成したい場合は、それをインスタンス化し、いくつかのクラスを選択する必要があります。 HashMapは他のものと同じくらい良いと思われるので、それを使ってください。

13
+0

このマップは、HashMapでないMapオブジェクトにしか適用できないという問題がありました – JorgeO

+6

特定のタイプのオブジェクトの宣言を避け、代わりにインターフェイス(または抽象的な親)を使用する必要があります。 "HashMap foo;"を避けるようにしてください。 "Map foo;"を使用します。代わりに – TofuBeer

+0

+1 TofuBeer(私ができる場合) –

6

どちらかCollections.emptyMap()、または型推論は、あなたのケースでは動作しない場合は、
Collections.<String, String>emptyMap()

1

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

このように作成された空のマップは変更できません。 – javashlook

1

、あなたはnullToEmptyユーティリティメソッドを利用することができますについてどう

関連する問題