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




linkedhashmap (5)

私は空の地図を作成する必要があります。

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

問題は、上記のコードがこの警告を生成することです。 型の安全性:MapからHashMapへのチェックされていないキャスト

この空の地図を作成する最良の方法は何ですか?


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

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

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



Collections.emptyMap() 、またはあなたのケースで型推論が機能しない場合は、
Collections.<String, String>emptyMap()


1)マップが不変である可能性がある場合:

Collections.emptyMap();

// or, in some cases:
Collections.<String, String>emptyMap();

コンパイラがどのようなMapが必要なのかを自動的に判断できないときは、後者を使用する必要があります(これは型推論と呼ばれます)。 たとえば、次のように宣言されたメソッドを考えてみましょう。

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は、 TreeMapLinkedHashMapなど、他のタイプのマップもインスタンス化するための同様のファクトリメソッドが含まれています。


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

}




unchecked