Я не понимаю, зачем вам нужны java Collections singletonMap? Полезно ли это в многопоточных приложениях?
Когда я буду использовать метод SingletonMap из java Collections?
Ответ 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, но они все еще досадно дословные по сравнению с приведенным выше кодом.