2016-05-22 20 views
0

ich eine Frage, die sich ein Stück Java-Code zu schreiben wie:Was ist der Unterschied zwischen "Foo" .equals (maybeFoo) und maybeFoo == null? False: maybeFoo.equals ("Foo")?

boolean isFoo(String maybeFoo){ 
    //Return true if maybeFoo is equal to "Foo" 
    //Don't throw any exceptions. 
} 

ich zwei Möglichkeiten:

1. return "Foo".equals(maybeFoo); 
2. return maybeFoo==null?false:maybeFoo.equals("Foo"); 

ich die Nummer 1 wählen, aber ich kann keinen Grund, warum Zahl geben 2 ist falsch. Ich sagte zu dem Interviewer, es ist nur meine Angewohnheit, mit einer starken Sprache umzugehen. Aber er scheint nicht zufrieden zu sein.

+1

Was ist die Methode 'MaybeFoo' in 2.? – Tunaki

+0

Ihre zweite Option könnte auch 'return maybeFoo! = Null && mayFoo.equals (" Foo ");' sein. – Tom

+1

Ich denke, die Optionen wurden vom Interviewer gegeben – Keiwan

Antwort

1

Der Unterschied zwischen denen, ist genau das, was Sie in den 2 Optionen

geschrieben ist
"Foo".equals(maybeFoo); 

Ist eine am häufigsten implementiert Kontrolle, weil Sie nicht kümmern müssen über einen Null-Check ... (auch weil nur einen Scheck mehr)

auf der anderen Seite dieses

maybeFoo.equals("Foo") 

nur eine NPE Ausnahme werfen, da sind Methoden auf ein null-referenzierte Objekt Aufruf

+1

aber no.2 prüft zuerst den Nullwert. – Pythoner

+0

ja, ich sehe, aber je weniger Dinge Sie überprüfen, desto besser ist die Leistung. –

1

Zuerst sollte gesagt werden, dass beide Versionen die gleiche Ausgabe bieten und keiner von ihnen eine Ausnahme auslöst, so ist es nur eine Frage von Cleaner Weise des Schreibens.

return "Foo".equals(maybeFoo); 

ist eine bessere Art und Weise zu tun, was angegeben ist, denn selbst wenn maybeFoo null ist, die Java-Funktion equals kehrt false und keine Ausnahme werfen.

Wenn jedoch maybeFoo null war, konnten Sie die Funktion equals darauf nicht aufrufen, sonst würden Sie eine NullPointerException erhalten. Daher müssen Sie im zweiten Beispiel danach suchen.

Der Punkt ist, dass wenn man etwas Arbeit mit weniger und Reiniger Code machen, können Sie mit das gehen sollte, denn das ist der Code, um Fehler besser lesbar und weniger anfällig macht.

+0

* "ist ein besserer Weg" * Das ist nur eine Meinung; P. * "Wenn" maybeFoo "falsch war" * Dies ist niemals möglich. * "cleaner code" * Aufruf von yoda conditions "cleaner" auch eine Meinung (imo a bad) – Tom

+0

Gemeint um null zu sagen, nicht falsch. Das wurde behoben. Ich sehe nicht, wie man die Notwendigkeit eines zusätzlichen Null-Checks beseitigt, indem man eine Eigenschaft einer bereits definierten Java-Funktion verwendet und daher den Code nicht verkürzt, um Code zu schreiben. – Keiwan

+0

Hängt von Ihrer Relation ab, do 'null' und wenn 'null' dort ein gültiger Wert ist. Es gibt die Meinung, dass "null" nicht als gültiger Wert verwendet werden sollte, da es meistens einen Programmierfehler bedeutet.Dies bleibt verborgen, wenn Sie Ihren Test stumm scheitern lassen und Sie nicht wissen, warum, weil Sie denken, dass 'mayfoo' _' '' Foo '' enthalten sollte ([mehr zum Vermeiden von 'null']) (https://github.com/) google/guava/wiki/UsingAndAvoidingNullExplained)). – Tom