2009-06-24 9 views

Antwort

43

Ein Beispiel. Angenommen, Sie haben eine Funktion

public String[] getFileNames(String criteria) { 

, um einige Dateinamen zu erhalten. Stellen Sie sich vor, Sie finden keine Dateinamen, die die Kriterien erfüllen. Was gibst du zurück? Sie haben 2 Möglichkeiten - entweder Null zurückgeben oder 0-Size-Array.

Die Variante mit 0-sized Array ist besser, weil der Anrufer für NULL zu überprüfen, nicht braucht und das Array in einer konsistenten Art und Weise verarbeiten kann - sagen, in einer Schleife (das leer sein würde dieser Fall).

Es gibt ein Kapitel über den in Effective Java, Item 27

+0

Um sicher zu sein: wenn der Code für "untere Schichten" verwendet werden soll, ist "null" viel performanter. Siehe auch den 3. Absatz von https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained – Pacerier

15

Es ist einfacher zu arbeiten als null in vielen Fällen, wo null die offensichtliche Alternative ist.

Angenommen, Sie möchten eine Iterable<String> zurückgeben, die (sagen wir) eine Liste relevanter Dateinamen enthält ... aber aus irgendeinem Grund gibt es keine. Sie könnte zurückgeben null, um dies anzuzeigen, aber dann muss der Anrufer, Sonderfall. Stattdessen, wenn Sie eine leere Sammlung zurückkehren, kann der Anrufer nach wie vor eine for-Schleife verstärkt nutzen:

for (String file : getFiles()) 

Warum also ein leeres Array anstelle eines leeren ArrayList oder etwas ähnliches? Arrays haben eine feste Größe, sodass ein leeres Array effektiv unveränderbar ist. Das bedeutet, dass Sie einen einzelnen Wert behalten und ihn an denjenigen zurückgeben können, den Sie mögen, da Sie wissen, dass sie damit nichts anfangen können. Das kann in manchen Situationen sehr nützlich sein.

4

es ein Ersatz für null ist, da Sie vor nicht für null überprüfen verwenden müssen. Formal ist es ein Sonderfall von special case design pattern (prüfen Sie auch Null-Objekt).

Eine andere idiomatische Verwendung ist Sammlungen toArray:

List<String> list = new ... ; 
// fill the list 
String[] array = list.toArray(new String[0]); 
+0

Beachten Sie, dass im zweiten Fall jeder 'String []' genauso gut funktionieren würde; Es benötigt nur eine Instanz des Typs, in den Sie es konvertieren möchten. –

Verwandte Themen