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:
- 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.
- 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.
- 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!
- 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? :-)
oft betrachtet, aber nein. – MeBigFatGuy
Sie meinen eine ternäre Operation? 'Zeichenfolge val = (a! = Null && a.child! = Null)? a.child.getValue(): null; ' –
nein er meint den elvis-operator?: – MeBigFatGuy