2010-02-12 10 views
32

Zusammenfassung sagt ziemlich alles. Hier ist der relevante Code-Snippet in ImmutableList.createFromIterable():Warum verbieten ImmutableList.of() und Freunde null Elemente?

if (element == null) { 
    throw new NullPointerException("at index " + index); 
    } 

Ich habe in diese mehrmals ausgeführt und kann nicht sehen, warum eine Mehrzweckbibliotheksfunktion diese Beschränkung auferlegen sollte.

Edit 1: von "Allzweck", würde ich mit 95% der Fälle glücklich sein. Aber ich glaube nicht, dass ich bis jetzt 100 Anrufe an ImmutableList.of() geschrieben habe und mehr als einmal davon gebissen worden bin. Vielleicht bin ich ein Ausreißer. :)

Edit 2: Ich denke, meine große Beschwerde ist, dass dies ein "Schluckauf" bei der Interaktion mit Standard java.util Sammlungen erstellt. Wie Sie in Ihrem Vortrag hervorgehoben haben, können Probleme mit null s in Sammlungen weit entfernt von dem Punkt auftauchen, an dem diese Nullen eingefügt wurden. Aber wenn ich eine lange Code-Kette habe, die Nullen in eine Standard-Sammlung auf der einen Seite legt und auf der anderen Seite richtig behandelt, dann kann ich die Google-Collection-Klasse an keiner Stelle ersetzen, weil es sofort geht Werfen Sie eine NullPointerException.

+1

Frage: interpretieren Sie "Mehrzweck" als "100% der Zwecke" oder "95% der Zwecke"? –

+0

in-line beantwortet –

+1

Re: bearbeiten 2: Dies ist zu behaupten, dass alle diese Zwischenpunkte auf dem Weg agnostic sein sollten, ob sie Nullen durch oder nicht passieren. Dem stimme ich nicht zu! Jede dieser APIs sollte entweder explizit zulassen oder explizit verbieten. Jeder kann weiterhin diesen Punkt drücken alles was Sie wollen, aber bitte beachten Sie, es ist reine Beschwerde und überhaupt nicht konstruktiv. Selbst wenn du jeden von uns überzeugt hast, dass wir falsch waren, falsch, falsch (natürlich, natürlich), wäre es trotzdem egal: Es ist nicht so, dass wir es sowieso ändern könnten. –

Antwort

34

Ich erklärte dies in dem 25-Minuten-Punkt dieses Videos: http://www.youtube.com/watch?v=ZeO_J2OcHYM

Sorry für die faule Antwort, aber das ist doch nur ein „Warum“ -Frage (wohl nicht angemessen zu Stackoverflow?).

EDIT: Hier ist ein weiterer Punkt, ich bin mir nicht sicher, machte ich im Video klar: die Summe (über den gesamten Java-Code der Welt), Menge an zusätzlichen Code, der für diese null-freundlichen Fälle geschrieben werden muss die alten Standbys Collections.unmodifiableList(Arrays.asList(...)) usw. zu benutzen, ist durch die Summe (über den gesamten Java-Code der Welt) von zusätzlichen checkArgument(!foos.contains(null)) Anrufen überwältigt, die jeder hinzufügen müsste, wenn unsere Sammlungen sich nicht darum kümmern würden. Die meisten, von FAR, verlangen, dass Nullen vorhanden sind und dass sie wirklich schnell ausfallen sollten, wenn überhaupt.

+0

Ich denke, meine Erfolgsgeschichte von Fragen über Google-Sammlungen auf SO ist nicht so heiß. : -/ –

+9

-1. Erzähl mir nicht, was ich in meine Sammlungen tun soll oder nicht. Nullen sind oft in meinen Listen gültig. Es ist selten, dass ich Nullen in einem Set oder einer Map möchte, aber es gibt viele andere Tools, die ich verwenden kann, wenn ich mich vor NULL-Elementen schützen möchte. – finnw

+24

Erstens, wer sagt Ihnen, dass Sie nicht null in eine Sammlung setzen sollen? Wenn es nötig ist, wie wir Googler in etwa 5% der Zeit benötigen (wir haben das sorgfältig studiert), verwenden Sie einfach eine Sammlung, die das unterstützt. Zweitens wurde eine Wahl getroffen, und diese Frage fragt, warum die Wahl getroffen wurde. Macht es wirklich Sinn, die Antwort zu verwerfen, weil Sie die Wahl nicht mögen? Es ist immer noch die Antwort auf die gestellte Frage. –

0

Ein Grund ist, dass es Funktionen, die auf der Liste funktionieren, nicht jedes Element auf Null überprüfen muss, was die Leistung erheblich verbessert.

+4

Nein, die Leistungsverbesserungen, die wir daraus erhielten, waren SEHR klein im großen Schema der Dinge. –

+0

Ausgenommen Funktion notiert ihren Parameter als @Nullable, so dass Sie tatsächlich überprüfen müssen, ob NULL die Codeüberprüfung erfüllt, obwohl die Liste keine Nullen enthalten kann. (lol) – Trejkaz

5

Im Allgemeinen gehören in Google Collections die Entwickler zu der Gruppe, die nicht glaubt, dass Nullwerte ein erwarteter allgemeiner Zweckparameter sein sollten.

Verwandte Themen