Intervista: Java Equals

Mi è stata fatta questa domanda nell’intervista. Quale dei seguenti è meglio usare

MyInput.equals("Something"); 

O

 "Something".equals(MyInput); 

Grazie

Mi piacerebbe andare

 "Something".equals(MyInput); 

in questo caso se MyInput è null allora non genererà NullPointerException

Qui siamo sicuri che l’object su cui equals() sta per invocare NOT NULL è NOT NULL .

E se ti aspetti che NullPointerException dal tuo codice per prendere una decisione o gettare / avvolgere, allora vai per primo.

Non c’è impatto sulle prestazioni

Per essere il contrarian …. 🙂

La prima riga potrebbe bloccarsi se MyInput è nullo, ma quello è solo un programmatore di codice (di solito con una sbornia C) usato quando non vuole affermare che “MyInput” può essere nullo.

Se viene utilizzata la seconda opzione, forse questa linea non causerà NullPointerException, ma potrebbero essere le seguenti righe.

Credo che sia meglio conoscere il ansible stato delle variabili piuttosto che basarsi su un costrutto di codice che faciliti la tua coscienza.

Il primo genererà NullPointerException se MyInput è null , mentre il secondo restituirà semplicemente false , quindi quest’ultimo potrebbe essere preferibile in alcuni casi (o forse il primo, se non si aspetta che MyInput sia nullo e voglia fallire velocemente) .

Beh, che ne dici se scriviamo tutto il nostro codice capovolto per un cambiamento?

Coloro a cui piacciono prima le loro costanti, come si sentirebbero quando vedono questo?

 if ( 2 == i) 

Nascondere una NullPointerException, a mio parere, non è mai un vantaggio ma una mancanza nel design.

Se non ti aspetti mai una NullPointerException ma ne hai una, devi far esplodere la tua applicazione, seguire i log e capire perché è successo. Potrebbe essere un caso aziendale che hai perso del tutto 🙂

Se opzionalmente ti aspetti un parametro nullo e non sei interessato a gestirlo separatamente, usa un metodo di utilità come StringUtils.equals (…)

Detto questo, non permetto mai a nessuno dei membri del mio team di utilizzare il secondo modulo perché non è coerente e non è leggibile.

Se si desidera essere dei veri e propri smarty-pants, è ansible evidenziare la possibilità che MyInput possa essere una sottoclass speciale di String che ha hashcode metodi equals e hashcode . In tal caso l’ordine della dichiarazione è di vitale importanza.

Ecco un esempio di vita reale: che ne dici se vuoi confrontare le stringhe che contengono numeri e vuoi che gli zeri iniziali vengano ignorati? Ad esempio, Lecture1 equivarrebbe a Lecture01 .

vorrei andare a “qualcosa” .equals (myInput); perché la variabile può essere nullo, semplicemente lancia un’eccezione se la variabile è nulla.

Un buon sviluppatore cercherà sempre di evitare una NullPointerException , quindi la risposta migliore sarebbe usare "Something".equals(myInput) .