2010-07-13 11 views
16

Ich überprüfe ein Handbuch von Best Practices und Empfehlung Codierung Java denke ich ist zweifelhaft.Java: "xx" .equals (Variable) besser als variable.equals ("xx"), TRUE?

Recomendation:

String variable; 

"xx".equals(variable) // OK 

variable.equals("xx") //Not recomended 

Da verhindert Auftreten von Nullpointer, die nicht

Ist das wahr gesteuert werden?

+3

Wenn Sie ein technisches Handbuch schreiben, haben Sie größere Grammatikprobleme, über die Sie sich Gedanken machen müssen, als eine kleine Codierungsvorschrift wie diese. – Zak

+6

@ Zak, das ist nicht wirklich relevant. Woher weißt du, dass das Handbuch auf Englisch sein wird? Vielleicht schreibt Xerg fließend in eine andere Sprache und erstellt das Handbuch in dieser Sprache. Jeder, der antwortete, konnte herausfinden, was der Kern der Frage war. –

+1

Ich schreibe kein Handbuch. Ich überprüfe nur. Entschuldige mein Englisch, ich bin ein besserer Leser als ein Schriftsteller. – Xerg

Antwort

23

Dies ist eine sehr häufige Technik, die dazu führt, dass der Test false zurückgibt, wenn die Variable null ist, anstatt eine NullPointerException zu werfen. Aber ich denke, ich werde anders sein und sagen, dass ich das nicht als eine Empfehlung betrachten würde, der Sie immer folgen sollten.

  • Ich denke auf jeden Fall, dass es etwas ist, das alle Java-Programmierer beachten sollten, da es ein allgemeines Idiom ist.
  • Es ist auch eine nützliche Technik, um Code prägnanter zu machen (Sie können den Null- und nicht Null-Fall zur gleichen Zeit behandeln).
  • Aber:

    • Es macht den Code schwerer zu lesen: "If blue is the sky..."
    • Wenn Sie überprüft nur, dass Ihr Argument in der vorhergehenden Zeile nicht null ist, dann ist es nicht erforderlich.
    • Wenn Sie vergessen haben, auf Null zu testen und jemand mit einem Null-Argument kommt, dass Sie es nicht erwartet haben, dann ist ein NullPointerException nicht unbedingt das schlechteste mögliche Ergebnis. So zu tun, als wäre alles in Ordnung und zu tragen, bis es später scheitert, ist nicht wirklich eine bessere Alternative. Schnelles Scheitern ist gut.
    • Ich persönlich nicht denke, die Verwendung dieser Technik sollte in allen Fällen erforderlich sein. Ich denke, es sollte von Fall zu Fall dem Urteil des Programmierers überlassen bleiben. Das Wichtigste ist, dass Sie sicherstellen, dass Sie den Null-Fall in einer angemessenen Weise behandelt haben und wie Sie das tun, hängt von der Situation ab. Die Überprüfung der korrekten Verarbeitung von Nullwerten könnte Teil der Test-/Code-Überprüfungsrichtlinien sein.

    +1

    "Es macht Ihren Code schwerer zu lesen:" Wenn blau ist der Himmel ... "- sonst bekannt als yoda Bedingungen - http: // en.wikipedia.org/wiki/Yoda_conditions – chrismarx

    10

    Es ist wahr. Wenn variablenull in Ihrem Beispiel ist,

    variable.equals("xx"); 
    

    eine NPE werfen, weil Sie keine Methode (equals) auf ein Null-Objekt aufrufen können. Aber

    "xx".equals(variable); 
    

    wird einfach false ohne Fehler zurückgeben.

    +0

    Aber 'Variable' ist' null' sollte wahrscheinlich ein Fehler sein. –

    +0

    @ Tom: Nun, vielleicht. Ich bin in Situationen geraten, in denen es ein Fehler sein sollte und viele andere Situationen, in denen es nicht sein sollte. Ich stimme Mark Byers tatsächlich zu, dass es sinnvoll ist, es von Fall zu Fall zu bewerten. –

    3

    Dies ist eine gängige Technik, die in Java (und C#) - Programmen verwendet wird. Das erste Formular vermeidet die Nullzeigerausnahme, da die .equals()-Methode für die konstante Zeichenfolge "xx" aufgerufen wird, die niemals null ist. Eine Nicht-Null-Zeichenfolge im Vergleich zu einer Null ist falsch.

    Wenn Sie wissen, dass variable niemals null sein wird (und Ihr Programm ist in anderer Weise falsch, wenn es jemals null ist), dann ist variable.equals("xx") in Ordnung.

    4

    Eigentlich denke ich, dass die ursprüngliche Empfehlung wahr ist. Wenn Sie variable.equals("xx") verwenden, erhalten Sie eine NullPointerException, wenn variable null ist. Das Setzen der konstanten Saite auf der linken Seite vermeidet diese Möglichkeit.

    Es liegt an Ihnen, ob diese Verteidigung den Schmerz wert ist, was viele Leute für eine unnatürliche Sprache halten.

    +1

    Peronsalized Ich finde die "Yoda-Version" sehr peinlich zu lesen, aber es vermeidet tatsächlich die Nullzeiger-Ausnahme. Die Alternative ist 's! = Null && s.equals ("xx")', was mehr zu tippen ist und einige zusätzliche Nanosekunden benötigt, um den zusätzlichen Vergleich durchzuführen. – Jay

    0

    Wenn Sie nach null überprüfen müssen, finde ich dies besser lesbar als if (variable != null && variable.equals("xx")). Es ist mehr eine Frage der persönlichen Präferenz.

    2

    Es ist wahr, dass die Verwendung einer Eigenschaft eines Objekts auf diese Weise hilft, die NPE zu vermeiden.

    Aber das ist, warum wir Ausnahmen haben, um diese Art von Sache zu behandeln.

    Vielleicht, wenn Sie "xx" .equals (Variable) verwenden, würden Sie nie wissen, ob der Wert der Variablen null ist oder nur ungleich "xx" ist. IMO ist es am besten zu wissen, dass Sie einen Nullwert in Ihrer Variablen erhalten, so dass Sie es neu zuordnen können, anstatt es einfach zu ignorieren.

    0

    Sie haben die Reihenfolge der Überprüfung richtig - wenn die Variable null ist, wird das Aufrufen von .equals auf der String-Konstante eine NPE verhindern - aber ich bin mir nicht sicher, ob ich das für eine gute Idee halte; Persönlich nenne ich es "slop".

    Slop ist, wenn Sie keine abnormalen Zustand feststellen, sondern in der Tat Gewohnheiten erstellen, um die Erkennung zu vermeiden. Wenn Sie über einen längeren Zeitraum hinweg eine Null als Zeichenfolge übergeben, führt dies möglicherweise zu Fehlern, die unklar und schwer zu finden sind.

    Codierung für Slop ist das Gegenteil von "Fail schnell scheitern schwer".

    Die Verwendung einer Null als Zeichenfolge kann gelegentlich einen großen "Spezial" -Wert ergeben, aber die Tatsache, dass Sie versuchen, es mit etwas zu vergleichen, zeigt an, dass Ihr Systemverständnis (im besten Fall) unvollständig ist Finden Sie diese Tatsache heraus, desto besser.

    Auf der anderen Seite, alle Variablen standardmäßig final zu machen, Generics zu verwenden und die Sichtbarkeit aller Objekte/Methoden zu minimieren, sind Gewohnheiten, die Slop reduzieren.

    0

    Als Randbemerkung, hier ist ein Design-Muster, in dem dieser Code Empfehlung keinen Unterschied machen könnte, da die String (dh Optional<String>) wegen des .isPresent nie null ist() Aufruf aus dem Entwurfsmuster:

    Optional<String> gender = Optional.of("MALE"); 
    if (gender.isPresent()) { 
        System.out.println("Value available."); 
    } else { 
        System.out.println("Value not available."); 
    } 
    gender.ifPresent(g -> System.out.println("Consumer: equals: " + g.equals("whatever"))); 
    
    Verwandte Themen