L'uso di Collections.singletonList di Java ()?


164

A cosa serve Collections.singletonList()Java? Capisco che restituisce un elenco con un elemento. Perché dovrei avere un metodo separato per farlo? In che modo l'immutabilità gioca un ruolo qui?

Esistono casi di utilizzo utili speciali per questo metodo anziché essere solo un metodo conveniente?


6
Ecco esempio di come può essere utile - stackoverflow.com/a/1239631/360811
shabunc


1
@sschuberth, si prega di confrontare le date per le domande. OP non sapeva che avrebbe potuto duplicare una domanda futura
KumarAnkit,

È vero, @KumarAnkit, ma i collegamenti ai duplicati sono ancora utili per le persone che cercano risposte alternative / potenzialmente migliori. In effetti, credo che il collegamento come duplicato debba essere considerato una cosa bidirezionale e che le domande / risposte migliori debbano essere mantenute, indipendentemente dal fatto che siano le più vecchie o le più recenti.
sschuberth,

@sschuberth, buon punto, ma dovrebbe essere classificato come simile, come questa domanda qui.
KumarAnkit

Risposte:


159

Il javadoc dice questo:

"Restituisce un elenco immutabile contenente solo l'oggetto specificato. L'elenco restituito è serializzabile."

Tu chiedi:

Perché dovrei avere un metodo separato per farlo?

Principalmente per comodità ... per evitare di dover scrivere una sequenza di dichiarazioni a:

  • creare un oggetto elenco vuoto
  • aggiungere un elemento ad esso e
  • avvolgerlo con un involucro immutabile.

Potrebbe anche essere un po 'più veloce e / o risparmiare un po' di memoria, ma è improbabile che questi piccoli risparmi siano significativi. (Un'applicazione che crea un gran numero di liste singleton è a dir poco insolita.)

In che modo l'immutabilità gioca un ruolo qui?

Fa parte delle specifiche del metodo; vedi sopra.

Esistono casi d'uso utili speciali per questo metodo, piuttosto che essere solo un metodo di praticità?

Chiaramente, ci sono casi d'uso in cui è conveniente usare il singletonListmetodo. Ma non so come distingueresti (oggettivamente) tra un caso d'uso normale e uno "particolarmente utile" ...


26

Ecco una vista sui metodi singleton:

Ho trovato questi vari metodi "singleton" utili per passare un singolo valore a un'API che richiede una raccolta di quel valore. Naturalmente, questo funziona meglio quando il codice che elabora il valore passato non deve essere aggiunto alla raccolta.


Potete aiutarmi a capire questa parte del commento sopra? "Ovviamente, questo funziona meglio quando il codice che elabora il valore passato non deve essere aggiunto alla raccolta." Non l'ho capito.
Bilbo Baggins,

2
Penso che si riferisca al fatto di non essere in grado di modificare la lista pass-in, poiché è immutabile.
Daniel Higueras,

2
@BilboBaggins - Quell'affermazione era ironica. :-) La frase "funziona meglio quando ..." è scritta più accuratamente "funziona solo se ...".
Stephen C,

18

Dal javadoc

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

esempio

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);
    }
}

Usalo quando il codice prevede un elenco di sola lettura, ma vuoi solo passare un elemento al suo interno. singletonListè (thread-) sicuro e veloce.


Grazie, questa è la risposta migliore. Fai anche un esempio invece di dire semplicemente "Chiaramente ci sono casi d'uso, ma non li conosco".
programmatore il

3

Per rispondere alla tua immutabile domanda:

Collections.singletonListcreerà un Elenco immutabile. Un Elenco immutabile (noto anche come Elenco non modificabile) non può avere i suoi contenuti modificati. I metodi per aggiungere o rimuovere elementi genereranno eccezioni se si tenta di modificare il contenuto.

Un Elenco singleton contiene solo quell'elemento e non può essere modificato.


2

Se una raccolta Immutable / Singleton si riferisce a quella che ha un solo oggetto e che non viene ulteriormente modificata, è possibile ottenere la stessa funzionalità creando una raccolta "UnmodifiableCollection" con un solo oggetto. Dal momento che la stessa funzionalità può essere raggiunta da Unmodifiable Collection con un oggetto, a quale scopo speciale serve la Collezione Singleton?


Creare una raccolta non modificabile con un oggetto nel modo "normale" e utilizzando il metodo singleton. Allora capisci subito perché.
kap,

1

singletonList può contenere istanze di qualsiasi oggetto. Lo stato dell'oggetto può essere modificato.

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);

Non possiamo definire unmodifiableList come sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.