Лучший способ создать пустую карту в Java
Мне нужно создать пустую карту.
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
проблема в том, что приведенный выше код выдает это предупреждение: безопасность типа: непроверенное приведение от карты к HashMap
Как лучше всего создать эту пустую карту?
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 fine2) если вы должны быть в состоянии изменить карту, то, например:
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(); } } }