Kiedy należy używać metody singletonMap kolekcji java?

81

Nie rozumiem, dlaczego potrzebujesz kolekcji java singletonMap ? Czy jest przydatny w aplikacjach wielowątkowych?

user710818
źródło
3
@skaffman: To byłby mój błąd. Na początku myślałem, że OP odnosi się do klasy Commons, SingletonMapwięc go zredagowałem. Od tego czasu
wycofałem

Odpowiedzi:

123

Zasadniczo pozwala to zrobić:

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

zamiast tego:

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

co jest o wiele przyjemniejsze, gdy masz tylko jedną parę klucz / wartość. Taka sytuacja prawdopodobnie nie występuje zbyt często, ale singleton()i singletonList()często może być przydatna.

Michael Borgwardt
źródło
12
Cały czas używam singletonMap w DAO, które używają szablonu JDBC Named Parameter Springa. Jeśli masz prostą instrukcję wyboru, taką jak „select foo from bar where id =: barId”, potrzebujesz mapy parametrów z pojedynczą parą klucz-wartość, barId = 123. To świetne miejsce do używania singletonMap ().
spaaarky21
1
Jeśli jakikolwiek interfejs API przyjmuje mapę jako dane wejściowe i używam Collections.singleton (klucz, wartość), to przekazuję niezmienną mapę, która może nie być dobra dla tego interfejsu API, ponieważ może to oznaczać, że API dodaje więcej elementów do tej mapy i w tym przypadku nic nie można zrobić, ponieważ jest niezmienny.
AKS
2
@AKS: w teorii tak, ale w praktyce dostęp tylko do odczytu jest znacznie bardziej powszechny i ​​z dokumentacji API powinno jasno wynikać, czy wpisy są dodawane do mapy przekazywanej jako parametr.
Michael Borgwardt
@PlabonDutta: Nie. Co mogłeś wiedzieć, próbując tego, patrząc na dokumentację API lub po prostu myśląc o tym, co oznacza „singleton”.
Michael Borgwardt
15

Jest to przydatne, jeśli chcesz przekazać mapę do jakiegoś ogólnego kodu (jako parametr lub w wyniku metody) i wiesz, że w tym konkretnym przypadku - ale być może nie w innych przypadkach, które przekazują mapę do tego samego ogólnego kod - mapa, którą chcesz przekazać ma tylko jeden klucz. W takim przypadku SingletonMap jest bardziej wydajna niż pełna implementacja mapy, a także wygodniejsza dla programisty, ponieważ wszystko, co musisz powiedzieć, można powiedzieć w konstruktorze.

hmakholm zostawił Monikę
źródło
8

Ponadto implementacja SingletonMap zwracana przez Collections.singletonMap () zajmuje mniej miejsca w pamięci niż zwykła mapa HashMap. Musi zawierać tylko dwa pola składowe: klucz i wartość, podczas gdy HashMap utrzymuje wewnętrzną tablicę obiektów Node oraz innych pól członkowskich. Jeśli więc tworzysz wiele takich map w pamięci, rozsądnym wyborem byłoby użycie Collections.singletonMap ().

Gary
źródło
4

To głównie dla wygody i abstrakcji. Niektóre interfejsy API przyjmują Collectionjako argument i dobrze jest mieć prosty sposób konwersji obiektów do formatu Setlub Map.

singletonMap()i singletonList()faktycznie zostały wprowadzone później singletonSet()w Javie 1.3, ponieważ singletonSet()okazały się przydatne.

tskuzzy
źródło
2
Nie ma metody singletonSet (), to jest po prostu nazywany Singleton ()
Michael Borgwardt
2

wiele odpowiedzi mówiło, kiedy, ale ja chcę wskazać, kiedy not use it

nie używaj go, jeśli chcesz put items later on,

bo umieść implementację singletonMapwoli rzucaćUnsupportedOperationException

Basheer AL-MOMANI
źródło
0

To tylko kolejny przykład, ale napisałem ten wiersz kodu:

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

zwróć uwagę na @Override. Interfejs bardziej ogólnie może przyjmować mapy wielu rzeczy; ta konkretna instancja po prostu zawsze zwraca mapę zawierającą jedną rzecz. Zauważ również, że kluczem do mapy jest Enum. Więc mapy nigdy nie powinny być duże, powinny po prostu zawierać wyniki dowolnych działań. W moim prawdziwym przykładzie jest do 5 akcji, a ta instancja używa tylko jednej z nich.

Aby być kompletnym, EnumSetlub EnumMapczęsto jest to właściwe w takich przypadkach, ale są one nadal irytująco gadatliwe w porównaniu z powyższym kodem.

djechlin
źródło