Подтвердить что ты не робот

Когда я буду использовать метод SingletonMap из java Collections?

Я не понимаю, зачем вам нужны java Collections singletonMap? Полезно ли это в многопоточных приложениях?

4b9b3361

Ответ 1

В принципе, это позволяет вам сделать это:

callAPIThatTakesAMap(Collections.singletonMap(key, value));

вместо этого:

Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);

что намного лучше, если у вас есть только одна пара ключ/значение. Эта ситуация, вероятно, не возникает очень часто, но singleton() и singletonList() могут быть весьма полезными.

Ответ 2

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

Ответ 3

Это в основном для удобства и абстракции. Некоторые API-интерфейсы принимают Collection как аргумент, и неплохо иметь простой способ преобразования объектов в Set или Map.

singletonMap() и singletonList() были введены после singletonSet() в Java 1.3, потому что singletonSet() оказался полезным.

Ответ 4

Кроме того, реализация SingletonMap, возвращенная Collections.singletonMap(), имеет меньший размер памяти, чем обычный HashMap. Он должен содержать только два поля-члена: ключ и значение, тогда как HashMap поддерживает внутренний массив объектов Node и других полей-членов. Поэтому, если вы создаете много этих карт в памяти, было бы разумным выбором для использования Collections.singletonMap().

Ответ 5

Это еще один пример, но я написал эту строку кода:

@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
    return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}

обратите внимание на @Override. Интерфейс в более общем плане может отображать карты многих вещей; этот конкретный экземпляр всегда возвращает карту, содержащую одну вещь. Также обратите внимание, что ключом к карте является Enum. Таким образом, карты никогда не должны быть большими, они просто должны содержать результаты тех действий, которые указаны. В моем реальном примере существует до 5 действий, и этот экземпляр использует только один из них.

Чтобы быть полным, в этих случаях часто подходит EnumSet или EnumMap, но они все еще досадно дословные по сравнению с приведенным выше кодом.