Найкращий спосіб створити порожню карту на Java


117

Мені потрібно створити порожню карту.

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

Проблема полягає в тому, що наведений вище код створює це попередження: Введіть безпеку: Невірно відзначений від Мапи до HashMap

Який найкращий спосіб створити цю порожню карту?


Який ваш оголошений тип для fileParameters?
jjnguy

Ви, ймовірно, також отримаєте ClassCastException.
Том Хотін - тайклін

1
fileParameters має бути Картою, а не HashMap.
Стів Куо

Відповіді:


241

1) Якщо Карта може бути незмінною:

Collections.emptyMap()

// or, in some cases:
Collections.<String, String>emptyMap()

Останнє вам доведеться використовувати останнє, коли компілятор не може автоматично визначити, який тип Map потрібен (це називається виведенням типу ). Наприклад, розглянемо метод, оголошений так:

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 . 😎


У більшості випадків введіть умовиводи (тобто. Map = Collections.emptyMap () працює)
Sébastien RoccaSerra

Так, правда. Я відредагував відповідь трохи більш вичерпною.
Jonik

16

Проблема полягала в тому, що цю карту можна застосувати лише до об’єкта Map, а не HashMap
JorgeO

7
Вам слід (як правило) уникати декларування об'єктів їх конкретних типів і використовувати замість цього інтерфейс (або абстрактний батьківський). Спробуйте уникати "HashMap <String, String> foo;" і використовуйте "Map <String, String> foo;" натомість
TofuBeer


10

Якщо вам потрібен екземпляр HashMap, найкращий спосіб:

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

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



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

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.