2012-11-01 4 views
5

Apropos Best Practices für die Behandlung von "Nullen" in Java (insbesondere "List" -Rückgaben), empfiehlt es sich, "Collections.emptyList()" aus GetMethod einer Entitätsklasse zurückzugeben ? oder sollten wir die Entity/Daten-Klassen/Methoden sauber und sauber halten und immer den Wert zurückgeben, den ihr Wert hat (selbst seine Null), und dann diesen Nullwert irgendwo anders im Code behandeln, zum Beispiel;Verwenden von Collections.emptyList() und Nullhandling

Class Reference{ 

private Reference reference; 

@XmlElement(name = "Reference") 
public List<Reference> getReference() { 
    if(reference==null){ 
     return Collections.emptyList(); 
    } 
    return reference; 
} 

public void setReference(List<Reference> reference) { 
    this.reference = reference; 
} 
} 

Oder besser, um diese Null "nach" zu behandeln, verwende ich eine grundlegende Methode Get?

EDIT/WARNING: nur für mein Szenario Ich bemerkte, dass dieser Ansatz meinen Code abstürzt Ich weiß nicht warum, wenn ich später anrufe;

References ref= (References) jaxbUnmarshaller.unmarshal(xmlReader) 

Ich erhalte eine nicht unterstützte Ausnahme Betrieb, funktioniert aber ok, wenn ich meine getMethod von collections.emtpyList reinigen. Also Vorsicht, wenn sie mit einem @XmlElement Tag

Antwort

2

Es ist in der Tat eine gute Methode, eine Nicht-Null-Sammlung zurückzugeben. Es speichert jeden Anrufer von

if (list != null) { 
    for (Item i : list) { 
     ... 
    } 
} 

Also der obige Code ist in Ordnung. Aber es wäre noch feiner, einen Nullwert in der Variablen reference zu verbieten. Wenn Sie einen Setter für die Liste haben, veranlassen Sie, dass eine Ausnahme ausgelöst wird, wenn die übergebene Liste null ist, oder transformieren Sie null in eine leere Sammlung. Auf diese Weise muss sich auch der Code in Ihrer Klasse nicht mit der Referenzvariable herumschlagen, die null ist.

Wenn Sie zwischen Null und leeren Liste unterscheiden müssen, verwenden Sie Guava's Optional Klasse, die Dinge viel klarer macht.

Nur eine Anmerkung: Da Sie eine Liste haben, sollte die Variable references (mit einer endgültigen s), genannt werden und die Accessoren werden sollte getReferences und setReferences benannt.

+0

Danke, alle großen Ratschläge, können wir dieses Null-Handling in Entitätsklasse Ansatz sagen gilt auch für Nicht-Listentypen wie String oder Integer? – Spring

+0

Sie würden Integer anstelle von int nur dann verwenden, wenn Sie ausdrücklich möchten, dass die Variable nullwertfähig ist. Andernfalls ist die Verwendung von int eine bessere Wahl. In Bezug auf String wird Null normalerweise verwendet, um zu bedeuten, dass das Attribut nicht gesetzt ist, und nicht eine leere Zeichenfolge. Anrufer wiederholen jedoch im Allgemeinen keine String-Zeichen. –

+0

nur für mein Szenario dieser Ansatz crasht meinen Code Ich weiß nicht, warum, wenn ich später (Referenzen) aufrufen jaxbUnmarshaller.unmarshal (xmlReader) .Ich bekomme eine nicht unterstützte Operation Ausnahme, und funktioniert, wenn ich meine getMethod aus collections.emtpyList .. – Spring

3

Im Allgemeinen null und „leer“ verwenden, können unterschiedliche Semantik haben: null bedeutet „es ist nicht da“, während „leer“ bedeutet „es ist da, aber es ist nichts drin“.

Wenn Ihre Klasse so ist, dass es keinen semantischen Unterschied zwischen "nicht vorhanden" und "leer" gibt, ist die Rückgabe einer leeren Sammlung besser: Sie speichert eine if Anweisung in all Ihren Anrufern, wodurch ihr Code sauberer aussieht. Außerdem würde ich in diesem Fall zunächst this.reference auf Collections.emptyList() setzen und einen if vom Getter entfernen. Natürlich müsste Ihr Setter in diesem Fall null -check Argument sein.

+0

aktualisiere ich die Frage – Spring

1

Im Allgemeinen: hängt davon ab (wenn Sie zwischen fehlender Liste und leerer Liste unterscheiden können).

Im Fall von XML-zugreifenden Bibliotheken scheint es eine Konvention zu geben, die immer eine veränderbare-Liste zurückgibt, so dass Sie die Entität dadurch aktualisieren können. Zumindest macht das der gesamte automatisch generierte WS-Code.

Zum Beispiel einen Verweis hinzufügen Sie

x.getReferences().add(someReference); 

tun würde, die zu einer Ausnahme führen würde, wenn Sie null zurückgegeben.

OTOH, diese Konvention hat oder braucht keinen Setter für die Referenzliste (Sie würden nur die Liste löschen und alles hinzufügen, anstatt eine neue Liste zu erstellen).

3

Meiner Erfahrung nach wird beim Programmieren von Java "Programmierung per Vertrag" oder "Design by contract" (Link) verwendet.
Dies bedeutet in Ihrem Beispiel, dass, wenn Ihre Referenz nicht durch eine äußere Entität festgelegt ist, Sie einfach eine Null zurückgeben.

1
private Reference reference = Collections.emptyList(); 

public List<Reference> getReference() { 
    return reference; 
} 

public void setReference(List<Reference> reference) { 
    if(reference==null) 
     reference = Collections.emptyList(); 
    this.reference = reference; 
} 
Verwandte Themen