Ich frage mich, warum java.util.ArrayList
man das hinzufügen darf null
. Gibt es einen Fall , wo ich möchte hinzufügen , null
um ein ArrayList
?
Ich stelle diese Frage, weil wir in einem Projekt einen Fehler hatten, bei dem Code hinzugefügt wurde null
, ArrayList
und es schwierig war, zu erkennen, wo der Fehler war. Offensichtlich wurde ein NullPointerException
geworfen, aber nicht, bis ein anderer Code versuchte, auf das Element zuzugreifen. Das Problem bestand darin, den Code zu finden, der das null
Objekt hinzugefügt hat . Es wäre einfacher gewesen, ArrayList
eine Ausnahme im Code auszulösen, in dem die Elemente hinzugefügt wurden.
java
api-design
collections
Alfredo Osorio
quelle
quelle
null
in den meisten ihrer Sammlungen nicht).null
die Standardmethode ist, um fehlende Daten in Java darzustellen, egal ob Sie möchten oder nicht. Tatsächlich mögen es viele Leute nicht und machen es zu einem Argument für Dinge im funktionalen Programmierstil. Die am besten bewertete Antwort ergibt keinen Sinn / erfasst nicht das Wesentliche des Problems.null
ist. "Missing" ist nur eine von mehreren möglichen Interpretationen vonnull
. Andere gültige Interpretationen können "Unbekannt", "Nicht anwendbar" oder "Nicht initialisiert" sein. Wasnull
darstellt, hängt von der Anwendung ab. Wie die Python-Community sagen würde: "Weigern Sie sich angesichts der Mehrdeutigkeit, die Versuchung zu erraten." Es wäre nur eine Vermutung, sich zu weigern, null in einem Behälter zu halten, der dazu in der Lage ist.Antworten:
Diese Entwurfsentscheidung scheint hauptsächlich auf die Benennung zurückzuführen zu sein.
Der Name ArrayList empfiehlt dem Leser eine Funktionalität, die Arrays ähnelt - und es ist für Java Collections Framework- Designer selbstverständlich , dass die große Mehrheit der API-Benutzer davon ausgeht, dass sie ähnlich wie Arrays funktioniert.
Dies beinhaltet insbesondere die Behandlung von Nullelementen. API-Benutzer, die wissen, dass unten funktioniert OK:
Es wäre ziemlich überrascht herauszufinden, ob ein ähnlicher Code für ArrayList NPE auslösen würde:
Die obigen Überlegungen werden im JCF-Lernprogramm vorgestellt, in dem Punkte hervorgehoben werden, die auf eine enge Ähnlichkeit zwischen ArrayList- und einfachen Arrays hinweisen:
Wenn Sie möchten, dass eine List-Implementierung keine Nullen zulässt, sollten Sie sie so
NonNullableArrayList
oder so ähnlich nennen, um zu vermeiden, dass API-Benutzer verwirrt werden.Randnotiz: In den nachstehenden Kommentaren finden Sie eine Hilfsdiskussion sowie zusätzliche Überlegungen , die die hier dargelegte Argumentation stützen.
quelle
LinkedList
auchnull
Listeneinträge unterstützt .null
Einträgen in vielen Fällen nützlich ist.Null kann ein gültiger Wert für ein Element einer Liste sein. Angenommen, Ihre Liste enthält Elemente, die optionale Daten zu einer Benutzerliste darstellen und in derselben Reihenfolge wie die Benutzer gespeichert sind. Wenn die zusätzlichen Daten ausgefüllt sind, enthält Ihre Liste die zusätzlichen Daten, andernfalls ist der einem Benutzer entsprechende Steckplatz null. (Ich bin sicher, es gibt bessere Beispiele, aber Sie bekommen die Idee)
Wenn Sie nicht zulassen möchten, dass Nullen hinzugefügt werden, können Sie die Array-Liste mit einem eigenen Wrapper umschließen, der ausgelöst wurde, als Null hinzugefügt wurde.
quelle
ArrayList
erlaubt null von Entwurf. Es ist beabsichtigt. Aus dem Javadoc :Die Antwort auf "warum" lautet, dass die ArrayList in Fällen, in denen ein
null
in die Liste aufgenommen werden muss, nicht verwendet werden könnte, wenn dies nicht der Fall wäre . Im Gegensatz dazu können Sie verhindern, dass eine ArrayList Nullen enthält, indem Sie Werte entweder vor dem Hinzufügen testen oder einen Wrapper verwenden, der dies verhindert.Offensichtlich hat jeder Fall
null
eine eindeutige Bedeutung. Dies kann beispielsweise bedeuten, dass der Wert an einer bestimmten Position in der Liste nicht initialisiert oder angegeben wurde.Sie können dieses Verhalten problemlos implementieren, indem Sie eine Wrapper-Klasse erstellen. Dies ist jedoch nicht das Verhalten, das die meisten Programmierer / Anwendungen benötigen.
quelle
Gibt es einen Fall, in dem ich einer ArrayList null hinzufügen möchte?
Klar, was ist mit der Vorbelegung? Sie möchten eines
ArrayList
von Dingen, die Sie noch nicht erstellen können, weil Sie nicht genügend Informationen haben. Nur weil Ihnen kein Grund einfällt, warum jemand etwas tun möchte, ist dies keine schlechte Idee. Wie auch immer. (Jetzt bin ich sicher, dass jemand mitkommt und sagt, Sie sollten stattdessen leere Objekte haben, die ein Muster erfüllen, über das sie in einem dunklen Blog gelesen haben, und dass Programmierer wirklich in der Lage sein sollten, Programme zu schreiben, ohne jemalsif
Anweisungen zu verwenden, bla bla.)Wenn ihr einen Vertrag habt, dass es niemals
null
s in einem Container geben sollte, dann liegt es an euch, sicherzustellen, dass der Vertrag eingehalten wird, wahrscheinlich am angemessensten durch Behauptung. Es hätte wahrscheinlich maximal 10 Codezeilen gedauert. Java macht es Ihnen unglaublich einfach, solche Dinge zu tun. Das JDK kann Ihre Gedanken nicht lesen.quelle
ensureCapacity(int minCapacity)
Methode und demArrayList(int initialCapacity)
Konstruktor in ArrayList integriert ist .null
in die vorab zugewiesenen (aber noch nicht verwendeten ) Einträge desArrayList
; aber wir können das zulassenensureCapacity
und doch nicht zulassen, dass andere Funktionen diesset
tun. Die Gründe, die an anderer Stelle genannt werden, scheinen stärker zu sein.set
einen Artikel mit einem beliebigen Wert zu versehen, der von zurückgegeben werden könnteget
. Selbst wenn ein normaler Versuch zuget
einem Element, für das Speicherplatz zugewiesen, aber nie geschrieben wurde, eine Ausnahmenull
list1.setOrEraseIfNull(index, list2.getOrReturnNull(index))
if (list2.valueSet(index)) list1.set(index, list2.get(index)); else list1.unset(index);
Dies scheint hier eher eine (Software-) philosophische Frage zu sein.
ArrayList
as a utility class wurde entwickelt, um in einem breiten Kontext möglicher Anwendungsfälle hilfreich zu sein.Entgegen Ihrer verborgenen Behauptung, dass von der Annahme von Null als gültigem Wert abgeraten werden sollte, gibt es viele Beispiele, in denen der Nullwert vollkommen legal ist.
Der wichtigste Grund ist, dass
null
es sich um dasdo not know
Äquivalent eines Referenztyps handelt, einschließlich der Framework-Typen. Dies impliziert, dass null in keinem Fall durch eine flüssigere Version desnothing
Werts ersetzt werden kann.Nehmen wir also an, Sie speichern die Ganzzahlen 1, 3, 7 in Ihrer Arrayliste am entsprechenden Index: Aufgrund einiger Berechnungen möchten Sie das Element am Index 5 abrufen. Ihr Array sollte also den Wert "no value saved" zurückgeben. Dies kann erreicht werden, indem null oder ein NullObject zurückgegeben wird . In den meisten Fällen ist die Rückgabe des eingebauten Nullwerts ausreichend aussagekräftig. Nach dem Aufruf einer Methode, die null zurückgeben kann, und der Verwendung ihres Rückgabewerts ist eine Überprüfung des zurückgegebenen Werts gegen null im modernen Code durchaus üblich.
quelle
Die Aussage
ist gültig und nützlich (ich glaube nicht, dass ich erklären muss, warum). Es ist ebenfalls nützlich, eine Sammlung von Dateien zu haben, von denen einige null sein können.
Die Nützlichkeit von Sammlungen, die Nullobjekte enthalten können, ergibt sich direkt aus der Nützlichkeit von Objekten, die Null sein können. Es ist wirklich so einfach.
quelle
Es ist einfacher, alles zu akzeptieren, als restriktiv zu sein und dann zu versuchen, Ihr Design nachträglich zu öffnen.
Was wäre zum Beispiel, wenn oracle / sun nur NonNullableArrayList zur Verfügung stellen würde, aber Sie möchten Ihrer Liste eine Null hinzufügen können. Wie würdest du es machen? Sie müssten wahrscheinlich ein ganz anderes Objekt erstellen, Sie könnten die NonNullableArrayList nicht erweitern. Wenn Sie stattdessen eine ArrayList haben, die alles akzeptiert, können Sie sie problemlos erweitern und das Add überschreiben, bei dem keine Nullwerte akzeptiert werden.
quelle
Nützlichkeit von null?
Ganz besonders, wenn Sie eine Liste mit Listen verwenden, um eine 2D-Platte des realen Lebens mit verschiedenen Positionen zu modellieren . Die Hälfte dieser Positionen kann leer sein (in zufälligen Koordinaten), während die ausgefüllten keine einfache Ganzzahl oder Zeichenfolge darstellen, sondern durch ein komplexes Objekt dargestellt werden. Wenn Sie die Positionsdaten behalten möchten, müssen Sie die leeren Stellen mit Null füllen, damit Ihre list.get (x) .get (y)führt nicht zu bösen Überraschungen. Um den Null-Ausnahmen entgegenzuwirken, können Sie nach Null suchen (sehr beliebt) oder ein Optional verwenden (was ich in diesem Fall nützlich finde). Die Alternative wäre, die leeren Stellen mit "Junk" -Objekten zu füllen, die auf der Straße zu allerlei Unordnung führen können. Wenn Ihre Nullprüfung fehlschlägt oder irgendwo vergessen wird, werden Sie von Java darüber informiert. Andererseits kann ein "Junk" -Platzhalterobjekt, das nicht richtig überprüft wird, unbemerkt bleiben.
quelle