Лучший способ создать пустую карту в Java
-
10-07-2019 - |
Вопрос
Мне нужно создать пустую карту.
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
Проблема в том, что приведенный выше код выдает это предупреждение: Безопасность типов: снятие отметки с карты в HashMap
Как лучше всего создать эту пустую карту?
Решение
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) Неизменяемая карта: Конечно, здесь нет больших преимуществ по сравнению с Эта карта ведет себя и работает сопоставимо с 2) Карта, которую вы можете изменить: Обновление (2018) . На Java 9 или новее самый короткий код для создания неизменяемой пустой карты: ... используя новый удобные фабричные методы из JEP 269 . & # 128526; ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()
Collections.emptyMap()
. из Javadoc :
Maps
,
и предпочтительнее в основном для согласованности и ремонтопригодности вашего
код. Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()
TreeMap
содержит аналогичные фабричные методы для создания экземпляров других типов карт, таких как LinkedHashMap
или <=> . Map.of()
Другие советы
Если вам нужен экземпляр 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();
}
}
}