2016-08-23 3 views
3

ich einige Code-Optimierung versuche und meine aktuellen einzigartigen Titel Validierung für ein Objekt sieht wie folgt aus:Java überspringen Null-Objekt, wenn sie mit .equals Rückkehr()

public boolean validateTitle(RawProfileConstraint rawProfileConstraint) { 
    RawProfileConstraint result = profileConstraintMapper.validateTitle(rawProfileConstraint.getTitle()); 
    return (!rawProfileConstraint.getTitle().equals(result.getTitle())); 
} 

Das funktioniert, bis er einen Wutanfall wirft, wo Die Datenbank kann keinen Datensatz mit dem Titel abrufen, den ich zu validieren versuche - auch bekannt als verfügbar. result wird in diesem Fall null sein. Wie kann ich einen Handler für null in diesem Fall Szenario ohne Ihre üblichen if-else integrieren?

+2

Warum "ohne die üblichen' if-else'"? –

+0

ein ternärer Zustand?: P – AxelH

+1

Hinweis: Ihre Benennung ist verwirrend. Ihre validateTitle-Methode für Ihren "Mapper" gibt ein RawProfileConstraint-Objekt zurück; Die validateTitle-Methode, die Sie anzeigen, gibt boolean zurück. Das ist zumindest inkonsequent! Meiner Meinung nach sollte eine Validierungsmethode ungültig sein und eine Ausnahme für ungültige Eingaben auslösen. oder Sie würden ein "reales Objekt" zurückgeben, das aussagekräftige Informationen enthält. Ich gebe nur wahr/falsch zurück; Das ist fast wie 1995 C-Programmierung Stil. Bedeutung: erwägen Sie, Ihre Methoden umzubenennen; bedenke, dass sie "auf die gleiche Weise arbeiten". – GhostCat

Antwort

5

einfach überprüfen, ob result vor dereferencing es null ist:

return result != null 
    && !rawProfileConstraint.getTitle().equals(result.getTitle()); 

oder

return result == null 
    || !rawProfileConstraint.getTitle().equals(result.getTitle()); 

je nachdem, was Sie das Ergebnis wünschen, wenn result == null (false und true jeweils) zu sein.

&& und || Kurzschluss, so werden sie den rechten Operanden, wenn nicht notwendig, nicht bewerten:

  • false && anything == false, so gibt es keine Notwendigkeit anything
  • true || anything == true, zu bewerten, so gibt es keine Notwendigkeit,
+0

Danke für die Hilfe. Ich habe übertrieben, weil ich das Gesamtbild mit anderen Dingen nicht richtig sehen konnte. Danke Andy und Ghostcat. – Kei

1

eine Option anything bewerten für null zu vermeiden, die Überprüfung ist ein Optional (i zu verwenden f Sie verwenden Java 8):

ersetzen

result.getTitle() 

mit

Optional.ofNullable(result).map(RawProfileConstraint::getTitle).orElse("") 
0

Ich würde vorschlagen, einen Schritt zurück. Warum denkst du, dass die Verwendung von if/else so eine schlechte Idee ist?

Glauben Sie wirklich, dass eine Lösung wie

public boolean validateTitle(RawProfileConstraint rawProfileConstraint) { 
RawProfileConstraint result = profileConstraintMapper.validateTitle(rawProfileConstraint.getTitle()); 
if (result == null) { 
    return false; 

return (!rawProfileConstraint.getTitle().equals(result.getTitle())); 

so viel ist „härter“ als Rückkehr mit zu lesen und & & als AndyT vorgeschlagen ?! Oder die "4 fließenden Aussagen in einem Ausdruck", die Eran vorschlägt ?!

Außerdem: mit der wenn das wie ... macht auch klar, dass Sie ein konzeptionelles Problem mit Ihrer Validierungsmethode haben. Es erscheint ein bisschen komisch, dass ein Null-Ergebnis falsch (oder wahr) verursachen sollte.

Lange Rede, kurzer Sinn: Ich denke, Ihr Code würde am meisten gewinnen, wenn Sie die "Schnittstellen", die Sie intern für Ihre Validierungsaufrufe verwenden, überdenken würden.

0

Ternary operator kann nützlich sein:

return reusult!=null?(!rawProfileConstraint.getTitle().equals(result.getTitle())):false; 
+0

'a? b: false ist einfach "a && b", wenn "b" vom booleschen Typ ist. Keine Notwendigkeit für den ternären Operator. –

+0

Danke @AndyTurner für den Vorschlag –