Nie rozumiem, dlaczego potrzebujesz kolekcji java singletonMap ? Czy jest przydatny w aplikacjach wielowątkowych?
Nie rozumiem, dlaczego potrzebujesz kolekcji java singletonMap ? Czy jest przydatny w aplikacjach wielowątkowych?
Odpowiedzi:
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.
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.
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 ().
To głównie dla wygody i abstrakcji. Niektóre interfejsy API przyjmują Collection
jako argument i dobrze jest mieć prosty sposób konwersji obiektów do formatu Set
lub Map
.
singletonMap()
i singletonList()
faktycznie zostały wprowadzone później singletonSet()
w Javie 1.3, ponieważ singletonSet()
okazały się przydatne.
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ę singletonMap
woli rzucaćUnsupportedOperationException
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, EnumSet
lub EnumMap
często jest to właściwe w takich przypadkach, ale są one nadal irytująco gadatliwe w porównaniu z powyższym kodem.
SingletonMap
więc go zredagowałem. Od tego czasu