In der Praxis ist es besser , eine leere Liste wie zurückzukehren dies :
return Collections.emptyList();
Oder so :
return new ArrayList<Foo>();
Oder hängt dies vollständig davon ab, was Sie mit der zurückgegebenen Liste tun werden?
Der Hauptunterschied besteht darin, dass Collections.emptyList()
eine unveränderliche Liste zurückgegeben wird, dh eine Liste, zu der Sie keine Elemente hinzufügen können. (Gleiches gilt für das List.of()
in Java 9 eingeführte.)
In den seltenen Fällen , in denen Sie tun wollen , die zurückgegebene Liste ändern, Collections.emptyList()
und List.of()
sind somit nicht eine gute Wahl.
Ich würde sagen, dass die Rückgabe einer unveränderlichen Liste vollkommen in Ordnung ist (und sogar der bevorzugte Weg), solange der Vertrag (die Dokumentation) nicht ausdrücklich etwas anderes angibt.
Außerdem wird emptyList()
möglicherweise nicht bei jedem Aufruf ein neues Objekt erstellt.
Implementierungen dieser Methode müssen nicht für jeden Aufruf ein separates Listenobjekt erstellen. Die Verwendung dieser Methode hat wahrscheinlich vergleichbare Kosten wie die Verwendung des gleichnamigen Felds. (Im Gegensatz zu dieser Methode bietet das Feld keine Typensicherheit.)
Die Implementierung emptyList
sieht wie folgt aus:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Wenn Ihre Methode (die eine leere Liste zurückgibt) sehr oft aufgerufen wird, bietet dieser Ansatz möglicherweise sogar eine etwas bessere Leistung sowohl in Bezug auf die CPU als auch in Bezug auf den Speicher.
Collections.emptyList()
also besser geeignet für beispielsweise Fehlerprüfungen und dergleichen?NullPointerException
durch ZurückkehrenCollections.emptyList()
stattnull
.Collections.emptyList()
ist iterierbar und gibt eine Länge zurück, sodass es für for-Schleifen verwendet werden kann, ohne dass eine Ausnahme ausgelöst wird.List.of()
?new ArrayList<>()
macht es auch die Entwurfsentscheidung klar; Elemente werden dieser Liste nicht hinzugefügt.Ab Java 5.0 können Sie den Elementtyp im Container angeben:
Ich stimme den anderen Antworten zu, dass Sie in Fällen, in denen Sie eine leere Liste zurückgeben möchten, die leer bleibt, diesen Ansatz verwenden sollten.
quelle
List<Foo> list = Collections.emptyList()
Collections.emptyList
ist unveränderlich, daher gibt es einen Unterschied zwischen den beiden Versionen, sodass Sie Benutzer des zurückgegebenen Werts berücksichtigen müssen.Durch die Rückgabe wird
new ArrayList<Foo>
immer eine neue Instanz des Objekts erstellt, sodass nur sehr geringe zusätzliche Kosten anfallen, die Ihnen möglicherweise einen Grund für die Verwendung gebenCollections.emptyList
. Ich benutzeemptyList
es gerne, nur weil es besser lesbar ist.quelle
Sei aber vorsichtig. Wenn Sie zurückkehren
Collections.emptyList()
und dann versuchen, einige Änderungen daranadd()
oder so vorzunehmen, haben Sie einUnsupportedOperationException()
Weil,Collections.emptyList()
das ein unveränderliches Objekt zurückgibt.quelle
Ich würde mit gehen,
Collections.emptyList()
wenn die zurückgegebene Liste in keiner Weise geändert wird (da die Liste unveränderlich ist), sonst würde ich mit Option 2 gehen.Der Vorteil von
Collections.emptyList()
ist, dass jedes Mal dieselbe statische Instanz zurückgegeben wird und daher nicht für jeden Aufruf eine Instanz erstellt wird.quelle
Verwenden Sie Collections.emptyList (), wenn Sie sicherstellen möchten, dass die zurückgegebene Liste niemals geändert wird. Dies wird beim Aufruf von emptyList () zurückgegeben:
quelle
Collections.emptyList()
Baukosten hatte. Das Anzeigen der Implementierungsdetails (obwohl wahrscheinlich nicht bei allen JVMs gleich) bestätigt, dass dies nicht der Fall ist. @Atul, von welcher JVM ist das?Die gegebenen Antworten betonen die Tatsache, dass
emptyList()
eine unveränderliche zurückgegeben wirdList
, geben aber keine Alternativen. Die Konstruktor-ArrayList(int initialCapacity)
Sonderfälle0
, bei denennew ArrayList<>(0)
statt zurückgegeben wird,new ArrayList<>()
könnten ebenfalls eine praktikable Lösung sein:[...]
(Quellen aus Java 1.8.0_72)
quelle