Лучший способ создать пустую карту в Java


Мне нужно создать пустую карту.

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

проблема в том, что приведенный выше код выдает это предупреждение: безопасность типа: непроверенное приведение от карты к HashMap

Как лучше всего создать эту пустую карту?

7 86

7 ответов:

1) если карта может быть неизменным:

Collections.emptyMap();

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

вам придется использовать последнее иногда, когда компилятор не может автоматически выяснить, какая карта необходима (это называется вывод типа). Например, рассмотрим метод, объявленный следующим образом:

public void foobar(Map<String, String> map){ ... }

при передаче пустой карты непосредственно к нему, вы должны быть явными о типе:

foobar(Collections.emptyMap());                 // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine

2) если вы должны быть в состоянии изменить карту, то, например:

new HashMap<String, String>();

(как tehblanx указал)


дополнительное соглашение: если ваш проект использует гуавы, у вас есть следующие варианты:

1) неизменное Map:

ImmutableMap.of();
// or:
ImmutableMap.<String, String>of();

конечно, никаких больших преимуществ здесь по сравнению с Collections.emptyMap(). из Javadoc:

этот карта ведет себя и выполняет сопоставимо с Collections.emptyMap(), и предпочтительно главным образом для последовательности и ремонтопригодности вашего код.

2) карта, которую вы можете изменить:

Maps.newHashMap();
// or:
Maps.<String, String>newHashMap();

Maps содержит аналогичные заводские методы для создания экземпляров других типов карт, таких как TreeMap или LinkedHashMap.

Если вам нужен экземпляр HashMap, лучший способ:

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

поскольку Map-это интерфейс, вам нужно выбрать какой-то класс, который создает его, если вы хотите создать пустой экземпляр. HashMap кажется таким же хорошим, как и любой другой - так что просто используйте это.

или Collections.emptyMap(), или если вывод типов не работает в вашем случае,
Collections.<String, String>emptyMap()

поскольку во многих случаях пустая карта используется для нулевого безопасного дизайна, вы можете использовать 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();
    }
  }

}