Utilisation de Collections.singletonList () de Java?

164

À quoi sert Collections.singletonList()Java? Je comprends qu'il renvoie une liste avec un élément. Pourquoi voudrais-je avoir une méthode distincte pour faire cela? Comment l'immuabilité joue-t-elle ici un rôle?

Existe-t-il des cas d'utilisation spéciaux utiles pour cette méthode plutôt que d'être simplement une méthode pratique?

PesteHammer
la source
6
Voici un exemple de comment cela peut être utile - stackoverflow.com/a/1239631/360811
shabunc
1
duplication possible de Arrays.asList () vs Collections.singletonList ()
sschuberth
1
@sschuberth, veuillez comparer les dates des questions. OP n'était pas au courant qu'il pourrait dupliquer une question future
KumarAnkit
C'est vrai, @KumarAnkit, mais les liens vers les doublons sont toujours utiles pour les personnes à la recherche de réponses alternatives / potentiellement meilleures. En fait, je pense que la liaison en tant que doublon doit être considérée comme une chose bidirectionnelle, et les meilleures questions / réponses doivent être conservées, qu'elles soient les plus anciennes ou les plus récentes.
sschuberth
@sschuberth, bon point, mais il devrait être classé comme similaire, comme cette question ici.
KumarAnkit

Réponses:

159

Le javadoc dit ceci:

"Renvoie une liste immuable contenant uniquement l'objet spécifié. La liste renvoyée est sérialisable."

Tu demandes:

Pourquoi voudrais-je avoir une méthode distincte pour faire cela?

Principalement par commodité ... pour vous éviter d'avoir à écrire une séquence d'instructions pour:

  • créer un objet de liste vide
  • ajoutez-y un élément, et
  • enveloppez-le avec un emballage immuable.

Cela peut aussi être un peu plus rapide et / ou économiser un peu de mémoire, mais il est peu probable que ces petites économies soient significatives. (Une application qui crée un grand nombre de listes de singleton est pour le moins inhabituelle.)

Comment l'immuabilité joue-t-elle ici un rôle?

Cela fait partie de la spécification de la méthode; voir au dessus.

Existe-t-il des cas d'utilisation spéciaux pour cette méthode, plutôt que d'être simplement une méthode pratique?

De toute évidence, il existe des cas d'utilisation où il est pratique d'utiliser la singletonListméthode. Mais je ne sais pas comment vous distingueriez (objectivement) entre un cas d'utilisation ordinaire et un cas "spécialement utile" ...

Stephen C
la source
26

Voici une vue sur les méthodes singleton:

J'ai trouvé ces diverses méthodes "singleton" utiles pour passer une valeur unique à une API qui nécessite une collection de cette valeur. Bien sûr, cela fonctionne mieux lorsque le code traitant la valeur transmise n'a pas besoin d'être ajouté à la collection.

Jim Ferrans
la source
Pouvez-vous m'aider à comprendre cette partie du commentaire ci-dessus? "Bien sûr, cela fonctionne mieux lorsque le code traitant la valeur transmise n'a pas besoin d'être ajouté à la collection." Je n'ai pas compris.
Bilbo Baggins
2
Je pense qu'il fait référence au fait de ne pas pouvoir modifier la liste transmise, car elle est immuable.
Daniel Higueras
2
@BilboBaggins - Cette déclaration était ironique. :-) La phrase "cela fonctionne mieux quand ..." est écrite plus précisément "cela ne fonctionne que si ...".
Stephen C
18

Depuis le javadoc

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

exemple

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

Utilisez-le lorsque le code attend une liste en lecture seule, mais que vous ne souhaitez y passer qu'un élément. singletonListest (thread-) sûr et rapide.

salsinga
la source
Merci, c'est la meilleure réponse. Vous donnez même un exemple au lieu de simplement dire "Il y a clairement des cas d'utilisation, mais je n'en sais rien".
theprogrammer le
3

Pour répondre à votre question immuable:

Collections.singletonListcréera une liste immuable. Une liste immuable (également appelée liste non modifiable) ne peut pas voir son contenu modifié. Les méthodes pour ajouter ou supprimer des éléments lèveront des exceptions si vous essayez de modifier le contenu.

Une liste singleton contient uniquement cet élément et ne peut pas être modifiée.

Ajain
la source
2

Si une collection Immutable / Singleton fait référence à celle qui n'a qu'un seul objet et qui n'est pas modifiée davantage, alors la même fonctionnalité peut être obtenue en créant une collection "UnmodifiableCollection" n'ayant qu'un seul objet. Puisque la même fonctionnalité peut être obtenue par la collection non modifiable avec un seul objet, alors à quoi sert la collection Singleton?

Anonymes
la source
Créez une collection non modifiable avec un objet de la manière "normale" et en utilisant la méthode singleton. Alors vous voyez immédiatement pourquoi.
kap le
1

singletonList peut contenir une instance de n'importe quel objet. L'état de l'objet peut être modifié.

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

On ne peut pas définir unmodifiableList comme ci-dessus.

Sarang
la source