Я не понимаю, зачем вам нужны 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
, но они все еще досадно дословные по сравнению с приведенным выше кодом.