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

117

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

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

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

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

Хорхе
источник
Какой у вас объявленный тип для fileParameters?
jjnguy
Вы, вероятно, тоже получите ClassCastException.
Том Хотин - tackline
1
fileParameters должен быть Map, а не HashMap.
Стив Куо,

Ответы:

242

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>()

(как указал Техбланкс )


Приложение : Если в вашем проекте используется Guava , у вас есть следующие альтернативы:

1) Неизменяемая карта:

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

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

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

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

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

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


Обновление (2018) : на Java 9 или новее кратчайший код для создания неизменяемой пустой карты:

Map.of()

... используя новые удобные фабричные методы из JEP 269 . 😎

Jonik
источник
В большинстве случаев вывод типа работает (например, map = Collections.emptyMap () работает)
Себастьен РоккаСерра
Да, верно. Я отредактировал ответ, чтобы он был немного более полным.
Jonik
16

Collections.emptyMap ()

basszero
источник
Проблема заключалась в том, что эту карту можно применить только к объекту Map, а не к HashMap
ХорхеО,
7
Вам следует (как правило) избегать объявления объектов их конкретных типов и вместо этого использовать интерфейс (или абстрактный родительский элемент). Старайтесь избегать "HashMap <String, String> foo;" и используйте «Map <String, String> foo;» вместо этого
TofuBeer
10

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

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

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

AndreiM
источник
7

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

Петер Штибрани
источник
2

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

}
Виталий Федоренко
источник