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


117

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

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

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

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


fileParametersの宣言されたタイプは何ですか?
jjnguy 2009年

おそらくClassCastExceptionも取得します。
トム・ホーティン-タックライン2009年

1
fileParametersはHashMapではなくMapである必要があります。
Steve Kuo

回答:


241

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

MapsTreeMapまたはなどの他のタイプのマップをインスタンス化するための同様のファクトリメソッドが含まれていますLinkedHashMap


アップデート(2018)Java 9以降では、不変の空のマップを作成するための最短のコードは次のとおりです。

Map.of()

...新しい使用した便利なファクトリメソッドからJEP 269。😎


多くの場合、型推論作品(すなわち= Collections.emptyMap()作品をマッピングします。)
セバスチャン・RoccaSerra

本当だとも。答えをもう少し包括的にするために編集しました。
ジョニック2009年

16

問題は、このマップはHashMapではなくMapオブジェクトにのみ適用できるということでした
JorgeO 2009年

7
特定のタイプのオブジェクトを宣言することは(通常)避け、代わりにインターフェース(または抽象親)を使用する必要があります。「HashMap <String、String> foo;」を避けてください。「Map <String、String> foo;」を使用します 代わりに
TofuBeer


10

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

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

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



2

多くの場合、空のマップは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();
    }
  }

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.