Лучший способ создать пустую карту в 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 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(); } } }