Я не розумію, навіщо вам потрібні колекції Java singletonMap ? Чи корисно це в багатопоточних програмах?
Я не розумію, навіщо вам потрібні колекції Java singletonMap ? Чи корисно це в багатопоточних програмах?
Відповіді:
По суті, це дозволяє зробити це:
callAPIThatTakesAMap(Collections.singletonMap(key, value));
а не це:
Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);
що набагато приємніше, коли у вас є лише одна пара ключ / значення. Така ситуація , ймовірно , не виникає дуже часто, але singleton()
і singletonList()
досить часто може бути корисним.
Це корисно, якщо вам потрібно передати карту якомусь загальному коду (як параметр або як результат методу), і ви знаєте, що в цьому конкретному випадку - але, можливо, не в інших випадках, коли карта передається тому ж загальному код - карта, яку ви хочете передати, має лише один ключ. У цьому випадку SingletonMap є більш ефективним, ніж повномасштабна реалізація карти, а також більш зручним для програміста, оскільки все, що вам потрібно сказати, можна сказати в конструкторі.
Крім того, реалізація SingletonMap, повернута Collections.singletonMap (), має менший розмір пам'яті, ніж звичайна HashMap. Він повинен містити лише два поля-члени: ключ і значення, тоді як HashMap підтримує внутрішній масив об'єктів Node плюс інші поля-члени. Отже, якщо ви створюєте багато цих карт в пам'яті, було б розумним вибором використовувати Collections.singletonMap ().
Це головним чином для зручності та абстракції. Деякі API сприймають Collection
аргумент як аргумент, і приємно мати простий спосіб перетворити об'єкти на Set
або Map
.
singletonMap()
і singletonList()
були фактично введені singletonSet()
в Java 1.3, оскільки singletonSet()
виявилися корисними.
багато відповідей казали вам, коли, але я хочу вказати, коли not use it
не використовуйте його, якщо хочете put items later on
,
тому що поставити реалізацію singletonMap
закиданняUnsupportedOperationException
Це лише черговий приклад, але я написав цей рядок коду:
@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}
зверніть увагу на @Override
. Інтерфейс загальніше може приймати карти багатьох речей; цей конкретний екземпляр завжди завжди повертає карту, що містить одну річ. Також зверніть увагу, що ключем до карти є Enum. Отже, карти ніколи не повинні бути великими, вони просто повинні містити результати будь-яких дій, які вказані. У моєму реальному прикладі є до 5 дій, і цей екземпляр використовує лише одну з них.
Щоб бути повним, EnumSet
або EnumMap
часто це доречно у цих випадках, але це все-таки дратує багатослів'я порівняно з кодом вище.
SingletonMap
тому відредагував його. З тих пір я