Лучший способ создать пустую карту в Java
Мне нужно создать пустую карту.
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
Проблема заключается в том, что приведенный выше код вызывает это предупреждение:
Тип безопасности: снятие флажка с карты на HashMap
Каков наилучший способ создания этой пустой карты?
Ответы
Ответ 1
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)
Addendum: если ваш проект использует Guava, у вас есть следующие варианты:
1) Неизменяемая карта:
ImmutableMap.of();
// or:
ImmutableMap.<String, String>of();
Конечно, здесь нет больших преимуществ по сравнению с Collections.emptyMap()
. Из Javadoc:
Эта карта ведет себя и выполняет сравнимо с Collections.emptyMap()
, и предпочтительнее в основном для обеспечения согласованности и код.
2) Карта, которую вы можете изменить:
Maps.newHashMap();
// or:
Maps.<String, String>newHashMap();
Maps
содержит похожие методы factory для создания экземпляров других типов карт, например TreeMap
или LinkedHashMap
.
Ответ 2
Метод emptyMap класса Collections.
Ответ 3
Collections.emptyMap()
Ответ 4
Если вам нужен экземпляр HashMap, лучший способ:
fileParameters = new HashMap<String,String>();
Так как Map - это интерфейс, вам нужно выбрать какой-то класс, который создает его, если вы хотите создать пустой экземпляр. HashMap выглядит так же хорошо, как и любой другой, поэтому просто используйте это.
Ответ 5
Либо Collections.emptyMap()
, либо если вывод типа не работает в вашем случае,
Collections.<String, String>emptyMap()
Ответ 6
Как насчет:
Карта < String, String > s = Collections.emptyMap();
Ответ 7
Так как во многих случаях пустая карта используется для нуль-безопасного проектирования, вы можете использовать утилиту 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();
}
}
}