2014-11-22 11 views
5

Wenn ich Code bin ich frustriert mit Null-Checks. Vor allem beim Codieren von Datenstrukturen!Gibt es ein?. Operator für Java, um Nullzeigerüberprüfung durchzuführen?

Ich habe es zu tun, wie

String val; 
if(a != null && a.child != null) 
    val = a.child.getValue(); 
else 
    val = null; 

Etwas Art dieses ...

Gibt es einen Operator wie?. (was ist ein Teil von C#) für Java, um die Last zu kürzen?

С # Beispiel:

String val = a?.child?.getValue(); 
+2

oft betrachtet, aber nein. – MeBigFatGuy

+0

Sie meinen eine ternäre Operation? 'Zeichenfolge val = (a! = Null && a.child! = Null)? a.child.getValue(): null; ' –

+2

nein er meint den elvis-operator?: – MeBigFatGuy

Antwort

2

Es gibt keine?. Operator in Java, also, wie Hari bemerkt, müssen Sie Dinge auf "langatmige Weise" tun. Man könnte jedoch argumentieren, dass dies eine gute Sache ist, da es die Verwendung von Nullen entmutigt.

Zum Beispiel, in OP-Code, warum setzen Sie val auf null wenn ein oder es Kind ist nicht da? Nehmen wir an, dass dies eine Funktion ist und val zurückgegeben wird. Dies ist ein Code-Geruch: es schiebt nur die Anforderung für eine weitere Null-Prüfung an die Benutzer Ihres Codes. Es wird ein endloser Zyklus von Null-Checks, der den Code völlig durcheinander bringt und die Logik verwirrt, weil Wartungsprogrammierer oft nicht sagen können, ob das eine legitime Logik ist oder ob ein paranoider ehemaliger Programmierer Fehler ignoriert. Don't mimic PHP!. Zitieren von dieser ausgezeichneten rant:

"Wenn etwas entweder unsinnig oder mit einem Fehler abbrechen, wird es (PHP) etwas unsinnig tun."

PHP macht eine schreckliche Design-Wahl. Es ist viel besser, mit einem Fehler abzubrechen, als etwas unsinniges zu tun.

Stattdessen sollten Sie Fragen wie stellen:

  1. Was bedeutet es für eine Null zu sein? Ist das ein Programmierfehler? Wenn ja, werfen Sie RuntimeException/IllegalArgumentException. Wenn dies ein kritischer Code ist und Sie "nicht scheitern" können, protokollieren Sie zumindest, dass Sie über etwas Fischiges tapezieren, also wird es vielleicht repariert.
  2. Was passiert, wenn a.child.getValue() selbst null zurückgibt? Wie sagt mein Anrufer den Unterschied zwischen dieser Null und dem "a oder Kind ist null" Null? Sie können nicht.
  3. Wenn es einen guten Standardwert gibt, verwenden Sie ihn. Wenn Sie eine Sammlung oder ein Array verwenden, übergeben Sie nicht null, um "leer" zu bedeuten. Pass ein Collections.emptyXXX(), z.B. an emptyList oder ein leeres Array. Setzen Sie die Zeichenfolge nicht auf null, sondern auf die leere Zeichenfolge "". BTW, das macht Ihre hashCode(), equals(), and compareTo() viel einfacher!
  4. Verwenden Sie die Null Object Pattern.. Wenn a eine Instanz von Foo ist, definiere eine statische finale Foo.NULL, die ein Kind hat, dessen Wert selbst etwas "nullish" ist - entweder null oder "".

Manchmal können Sie wirklich nichts von diesen Dingen tun. Es gibt gültige Gründe dafür, dass Argumente null sind, oder Sie müssen Rückwärtskompatibilität mit einem früheren ungültigen Entwurf oder einer 3rd-Party-Bibliothek zulassen. IMO, das sollte selten sein, und Sie sollten dokumentieren, was passiert. Und vielleicht sollten Sie etwas anderes als Null (oder 0) zurückgeben, um dies zu reflektieren. Zum Beispiel

/** 
    countPeople 
    @param node null means the foobar can't connect to the database, 
    @return  Foobar.ERR_NO_DB if node is null 
*/ 

In OPs Beispiel sieht es aus wie ein eine Art von XML-Knoten sein kann, und die Java XML-Schnittstellen sind sehr groß und ein gutes NULL-Objekt für einen von ihnen zu schaffen wäre ein großes Unternehmen sein. (Hmm, vielleicht ein gutes kleines Open-Source-Projekt?). In diesem Fall rufen Sie wahrscheinlich sehr oft a.child.getValue() an. Schreiben Sie eine kleine Dienstprogrammfunktion, um das zu handhaben und die Nullen zu behandeln. Anstatt langwieriger Null-Checks sind sie zumindest in wenigen Utility-Methoden eingekapselt. TROCKEN. Und die Tatsache, dass die Schecks langwierig sind, ermutigte Sie zu einem besseren Design. Also das Fehlen der? Betreiber war eine gute Sache, oder? :-)

6

Keine

Wie bei den meisten Dingen in Java, Sie haben es in der langatmigen Weise zu tun. Hey, zumindest ist es besser lesbar - wenn du einen Null-Check machen musst, warum nicht explizit und leicht sichtbar machen (Devil's Advocate hier spielen)

+1

Für den Fall, dass es nicht klar aus der Antwort ist: Das C# -Beispiel macht die Nullprüfung * explizit *, es ist einfach * sichtbar * und der Code definitiv * lesbarer *. –

1

Es gibt keinen solchen Operator in Java. Das nächste, was ich denken kann, dass Java unterstützt, ist Yoda conditions, die Sie für einen Wert gegen eine Konstante wie

if ("test".equals(str)) 

statt

if (str != null && str.equals("test")) 
+0

Was ist, wenn wir die Zeichenfolge "test" nicht kennen? –

+0

@sidkamaria Wenn Sie den "Test" 'String' nicht kennen, können Sie keine Yoda-Bedingungen verwenden. –

+0

Das ist irgendwie nicht nützlich für mich. Anyways hat etwas neues kennengelernt :) –

2

Der ?. Operator existiert nicht zu überprüfen erlauben würde, in Java.

Die "meisten" kompakt, was Sie tun können, ist die ?: ternäre Operator, die Sie "Kette":

String val = a != null && a.child != null ? a.child.getValue() : null; 

oder

String val = a == null ? null : a.child == null ? null : a.child.getValue(); 
+0

Das habe ich gemacht ... entweder benutze ich ** if ** Statements oder ** ternary operator **. Wie auch immer danke :) –

2

Nein gibt es keine?. Betreiber in JAVA. Sie können! = Operator für die Überprüfung nicht null verwenden

String val = (a != null && a.child !== null) ? a.child.getValue() : null;