Verwendung von Javas Collections.singletonList ()?

163

Was nützt Collections.singletonList()Java? Ich verstehe, dass es eine Liste mit einem Element zurückgibt. Warum sollte ich eine separate Methode haben wollen, um das zu tun? Wie spielt hier Unveränderlichkeit eine Rolle?

Gibt es spezielle nützliche Anwendungsfälle für diese Methode, anstatt nur eine bequeme Methode zu sein?

PlagueHammer
quelle
6
Hier ist ein Beispiel, wie es nützlich sein kann - stackoverflow.com/a/1239631/360811
shabunc
1
mögliches Duplikat von Arrays.asList () vs Collections.singletonList ()
sschuberth
1
@sschuberth, bitte vergleiche die Daten für die Fragen. OP war sich nicht bewusst, dass er / sie eine zukünftige Frage duplizieren könnte
KumarAnkit
Richtig, @KumarAnkit, aber Links zu Duplikaten sind immer noch nützlich für Leute, die nach alternativen / möglicherweise besseren Antworten suchen. Tatsächlich glaube ich, dass das Verknüpfen als Duplikat als bidirektionale Sache angesehen werden sollte und die besseren Fragen / Antworten beibehalten werden sollten, unabhängig davon, ob es sich um ältere oder neuere handelt.
Sschuberth
@sschuberth, guter Punkt, aber es sollte als ähnlich eingestuft werden, wie diese Frage hier.
KumarAnkit

Antworten:

159

Der Javadoc sagt dies:

"Gibt eine unveränderliche Liste zurück, die nur das angegebene Objekt enthält. Die zurückgegebene Liste ist serialisierbar."

Du fragst:

Warum sollte ich eine separate Methode haben wollen, um das zu tun?

In erster Linie aus Bequemlichkeitsgründen ... um zu vermeiden, dass Sie eine Folge von Anweisungen schreiben müssen, um:

  • Erstellen Sie ein leeres Listenobjekt
  • füge ein Element hinzu und
  • Wickeln Sie es mit einer unveränderlichen Hülle ein.

Es kann auch etwas schneller sein und / oder etwas Speicherplatz sparen, aber es ist unwahrscheinlich, dass diese kleinen Einsparungen erheblich sind. (Eine Anwendung, die eine große Anzahl von Singleton-Listen erstellt, ist gelinde gesagt ungewöhnlich.)

Wie spielt hier Unveränderlichkeit eine Rolle?

Es ist Teil der Spezifikation der Methode; siehe oben.

Gibt es spezielle nützliche Anwendungsfälle für diese Methode, anstatt nur eine bequeme Methode zu sein?

Natürlich gibt es Anwendungsfälle, in denen die Verwendung der singletonListMethode zweckmäßig ist . Aber ich weiß nicht, wie Sie (objektiv) zwischen einem gewöhnlichen und einem "besonders nützlichen" Anwendungsfall unterscheiden würden ...

Stephen C.
quelle
26

Hier ist eine Ansicht der Singleton-Methoden:

Ich habe festgestellt, dass diese verschiedenen "Singleton" -Methoden nützlich sind, um einen einzelnen Wert an eine API zu übergeben, für die eine Sammlung dieses Werts erforderlich ist. Dies funktioniert natürlich am besten, wenn der Code, der den übergebenen Wert verarbeitet, nicht zur Sammlung hinzugefügt werden muss.

Jim Ferrans
quelle
Können Sie mir helfen, diesen Teil des obigen Kommentars zu verstehen? "Dies funktioniert natürlich am besten, wenn der Code, der den übergebenen Wert verarbeitet, nicht zur Sammlung hinzugefügt werden muss." Ich habe es nicht verstanden.
Bilbo Beutlin
2
Ich denke, er bezieht sich darauf, dass er die übergebene Liste nicht ändern kann, da sie unveränderlich ist.
Daniel Higueras
2
@BilboBaggins - Diese Aussage war ironisch. :-) Der Satz "das funktioniert am besten, wenn ..." ist genauer geschrieben "das funktioniert überhaupt nur, wenn ...".
Stephen C
18

Aus dem Javadoc

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

Beispiel

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

Verwenden Sie diese Option, wenn der Code eine schreibgeschützte Liste erwartet, Sie jedoch nur ein Element darin übergeben möchten. singletonListist (thread-) sicher und schnell.

Salsinga
quelle
Danke, das ist die bessere Antwort. Sie geben sogar ein Beispiel, anstatt einfach zu sagen: "Natürlich gibt es Anwendungsfälle, aber ich weiß nichts darüber."
Programmierer
3

Um Ihre unveränderliche Frage zu beantworten:

Collections.singletonListerstellt eine unveränderliche Liste. Bei einer unveränderlichen Liste (auch als nicht veränderbare Liste bezeichnet) kann der Inhalt nicht geändert werden. Die Methoden zum Hinzufügen oder Entfernen von Elementen lösen Ausnahmen aus, wenn Sie versuchen, den Inhalt zu ändern.

Eine Singleton-Liste enthält nur dieses Element und kann nicht geändert werden.

Ajain
quelle
2

Wenn sich eine Unveränderliche / Singleton-Sammlung auf eine bezieht, die nur ein Objekt hat und die nicht weiter geändert wird, kann dieselbe Funktionalität erreicht werden, indem eine Sammlung "Unmodifizierbare Sammlung" mit nur einem Objekt erstellt wird. Welchen besonderen Zweck erfüllt die Singleton-Sammlung, da die nicht modifizierbare Sammlung mit einem Objekt dieselbe Funktionalität erreichen kann?

Anonym
quelle
Erstellen Sie eine nicht modifizierbare Sammlung mit einem Objekt auf "normale" Weise und unter Verwendung der Singleton-Methode. Dann sehen Sie sofort warum.
kap
1

singletonList kann eine Instanz eines beliebigen Objekts enthalten. Der Objektstatus kann geändert werden.

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

Wir können unmodizableList nicht wie oben definieren.

Sarang
quelle