Коли я повинен використовувати метод колекції java singletonMap?


81

Я не розумію, навіщо вам потрібні колекції Java singletonMap ? Чи корисно це в багатопоточних програмах?


3
@skaffman: Це було б моє погано. Спочатку я думав, що OP посилається на клас Commons, SingletonMapтому відредагував його. З тих пір я
відмінив

Відповіді:


123

По суті, це дозволяє зробити це:

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

а не це:

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

що набагато приємніше, коли у вас є лише одна пара ключ / значення. Така ситуація , ймовірно , не виникає дуже часто, але singleton()і singletonList()досить часто може бути корисним.


12
Я постійно використовую singletonMap у DAO, які використовують Іменований параметр JDBC шаблон Spring. Якщо у вас є простий оператор select, наприклад "select foo from bar where id =: barId", то вам знадобиться карта параметрів з однією парою ключ-значення, barId = 123. Це чудове місце для використання singletonMap ().
spaaarky21

1
Якщо який-небудь API приймає карту як вхід, і я використовую Collections.singleton (ключ, значення), тоді я передаю незмінну карту, що може бути недобре для цього API, оскільки може бути, що API додає більше елементів на цю карту, і в у цьому випадку нічого не можна зробити, оскільки він незмінний.
AKS

2
@AKS: теоретично так, але на практиці доступ лише для читання є набагато більш поширеним, і з документації API повинно бути зрозуміло, чи додаються записи на карту, передану як параметр.
Майкл Борґвардт

@PlabonDutta: Ні. Що ви могли б знати, спробувавши, переглянувши документи API або просто подумавши, що означає "синглтон".
Майкл Борґвардт,

15

Це корисно, якщо вам потрібно передати карту якомусь загальному коду (як параметр або як результат методу), і ви знаєте, що в цьому конкретному випадку - але, можливо, не в інших випадках, коли карта передається тому ж загальному код - карта, яку ви хочете передати, має лише один ключ. У цьому випадку SingletonMap є більш ефективним, ніж повномасштабна реалізація карти, а також більш зручним для програміста, оскільки все, що вам потрібно сказати, можна сказати в конструкторі.


8

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


4

Це головним чином для зручності та абстракції. Деякі API сприймають Collectionаргумент як аргумент, і приємно мати простий спосіб перетворити об'єкти на Setабо Map.

singletonMap()і singletonList()були фактично введені singletonSet()в Java 1.3, оскільки singletonSet()виявилися корисними.


2
Не існує методу singletonSet (), він просто називається singleton ()
Michael Borgwardt

2

багато відповідей казали вам, коли, але я хочу вказати, коли not use it

не використовуйте його, якщо хочете put items later on,

тому що поставити реалізацію singletonMapзакиданняUnsupportedOperationException


0

Це лише черговий приклад, але я написав цей рядок коду:

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

зверніть увагу на @Override. Інтерфейс загальніше може приймати карти багатьох речей; цей конкретний екземпляр завжди завжди повертає карту, що містить одну річ. Також зверніть увагу, що ключем до карти є Enum. Отже, карти ніколи не повинні бути великими, вони просто повинні містити результати будь-яких дій, які вказані. У моєму реальному прикладі є до 5 дій, і цей екземпляр використовує лише одну з них.

Щоб бути повним, EnumSetабо EnumMapчасто це доречно у цих випадках, але це все-таки дратує багатослів'я порівняно з кодом вище.

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