Korzystanie z kolekcji Java's Collections.singletonList ()?


164

Jaki jest pożytek z Collections.singletonList()języka Java? Rozumiem, że zwraca listę z jednym elementem. Dlaczego miałbym chcieć mieć na to oddzielną metodę? Jaką rolę odgrywa tutaj niezmienność?

Czy są jakieś specjalne przydatne przypadki użycia tej metody, a nie tylko wygodna metoda?


6
Oto przykład tego, jak to może być przydatne - stackoverflow.com/a/1239631/360811
shabunc


1
@sschuberth, porównaj daty pytań. PO nie był świadomy s / mógł być powielanie przyszłego pytanie
KumarAnkit

To prawda, @KumarAnkit, ale linki do duplikatów są nadal przydatne dla osób szukających alternatywnych / potencjalnie lepszych odpowiedzi. W rzeczywistości uważam, że linkowanie jako duplikat powinno być traktowane jako rzecz dwukierunkowa, a lepsze pytania / odpowiedzi powinny zostać zachowane, bez względu na to, czy są to starsze, czy nowsze.
sschuberth

@sschuberth, słuszna uwaga, ale powinno być sklasyfikowane jako podobne, jak to pytanie tutaj.
KumarAnkit

Odpowiedzi:


159

Javadoc mówi w ten sposób:

„Zwraca niezmienną listę zawierającą tylko określony obiekt. Zwrócona lista jest możliwa do serializacji.”

Ty pytasz:

Dlaczego miałbym chcieć mieć na to oddzielną metodę?

Przede wszystkim dla wygody ... aby uniknąć konieczności pisania sekwencji instrukcji w celu:

  • utwórz pusty obiekt listy
  • dodać do niej element i
  • owinąć go niezmiennym opakowaniem.

Może być również nieco szybszy i / lub zaoszczędzić trochę pamięci, ale jest mało prawdopodobne, aby te małe oszczędności były znaczące. (Aplikacja, która tworzy ogromną liczbę list singleton, jest co najmniej niezwykła).

Jaką rolę odgrywa tutaj niezmienność?

Stanowi część specyfikacji metody; patrz wyżej.

Czy istnieją jakieś specjalne użyteczne przypadki użycia tej metody, a nie tylko wygodna metoda?

Oczywiście istnieją przypadki użycia, w których wygodnie jest zastosować tę singletonListmetodę. Ale nie wiem, jak można (obiektywnie) odróżnić zwykły przypadek użycia od „szczególnie użytecznego” ...


26

Oto jedno spojrzenie na metody singleton:

Odkryłem, że te różne „pojedyncze” metody są przydatne do przekazywania pojedynczej wartości do interfejsu API, który wymaga zbioru tej wartości. Oczywiście działa to najlepiej, gdy kod przetwarzający przekazaną wartość nie musi być dodawany do kolekcji.


Czy możesz mi pomóc zrozumieć tę część powyższego komentarza? „Oczywiście działa to najlepiej, gdy kod przetwarzający przekazaną wartość nie musi być dodawany do kolekcji”. Nie rozumiem.
Bilbo Baggins,

2
Myślę, że odnosi się do braku możliwości modyfikacji przekazanej listy, ponieważ jest ona niezmienna.
Daniel Higueras

2
@BilboBaggins - To stwierdzenie było ironiczne. :-) Wyrażenie „działa najlepiej, gdy…” jest dokładniej zapisane „działa to w ogóle tylko wtedy, gdy…”.
Stephen C

18

Z pliku javadoc

@param  the sole object to be stored in the returned list.
@return an immutable list containing only the specified object.

przykład

import java.util.*;

public class HelloWorld {
    public static void main(String args[]) {
        // create an array of string objs
        String initList[] = { "One", "Two", "Four", "One",};

        // create one list
        List list = new ArrayList(Arrays.asList(initList));

        System.out.println("List value before: "+list);

        // create singleton list
        list = Collections.singletonList("OnlyOneElement");
        list.add("five"); //throws UnsupportedOperationException
        System.out.println("List value after: "+list);
    }
}

Użyj go, gdy kod oczekuje listy tylko do odczytu, ale chcesz przekazać w niej tylko jeden element. singletonListjest (wątkowo) bezpieczny i szybki.


Dzięki, to jest lepsza odpowiedź. Dajesz nawet przykład, zamiast po prostu powiedzieć: „Oczywiście są przypadki użycia, ale ja o nich nie wiem”.
theprogrammer

3

Aby odpowiedzieć na Twoje niezmienne pytanie:

Collections.singletonListutworzy niezmienną listę. Lista niezmienna (nazywana również listą niemodyfikowalną) nie może mieć zmiany zawartości. Metody dodawania lub usuwania elementów będą generować wyjątki, jeśli spróbujesz zmienić zawartość.

Lista pojedyncza zawiera tylko ten element i nie można jej zmienić.


2

Jeśli kolekcja Immutable / Singleton odnosi się do tej, która ma tylko jeden obiekt i która nie jest dalej modyfikowana, to tę samą funkcjonalność można osiągnąć, tworząc kolekcję „UnmodifiableCollection” zawierającą tylko jeden obiekt. Skoro ta sama funkcjonalność może zostać osiągnięta przez Unmodifiable Collection z jednym obiektem, to do jakiego specjalnego celu służy Singleton Collection?


Utwórz kolekcję niemodyfikowalną z jednym obiektem w „normalny” sposób i przy użyciu metody singleton. Wtedy natychmiast zobaczysz, dlaczego.
kap

1

singletonList może zawierać instancję dowolnego obiektu. Stan obiektu można modyfikować.

List<Character> list = new ArrayList<Character>();
list.add('X');
list.add('Y');
System.out.println("Initial list: "+ list);
List<List<Character>> list2 = Collections.singletonList(list);
list.add('Z');
System.out.println(list);
System.out.println(list2);

Nie możemy zdefiniować niemodyfikowalnej listy jak powyżej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.