2015-05-06 10 views
45

Sono consapevole che è preferibile chiamare il metodo equals per l'utilizzo dell'operatore == (vedere this question). Voglio che due stringhe vengano confrontate come uguali se sono entrambe nulle o se rappresentano la stessa stringa. Sfortunatamente il metodo equals getterà uno NPE se le stringhe sono null. Il mio codice è attualmente:Come confrontare due stringhe quando entrambe possono essere nulle?

boolean equals(String s1, String s2) { 
    if (s1 == null && s2 == null) { 
    return true; 
    } 
    if (s1 == null || s2 == null) { 
    return false; 
    } 
    return s1.equals(s2); 
} 

Questo è inelegante. Qual è il modo corretto per eseguire questo test?

+0

Com'è inelegante? Quale altro modo per determinare? –

+0

Usa 'StringUtils.equals (s1, s2)' in commons.lang – thoitbk

+2

@fge Non ho mai capito perché le persone postano le risposte come commenti. Mi piacerebbe sapere però, interessa condividere il tuo ragionamento? – Pureferret

risposta

78

Se Java 7+, utilizzare Objects.equals(); la sua documentazione specifica esplicitamente che:

[...] se entrambi gli argomenti sono nulli, viene restituito true e se esattamente un argomento è nullo, viene restituito falso. Altrimenti, l'uguaglianza viene determinata usando il metodo equals del primo argomento.

che è quello che vuoi.

Se non lo fate, il metodo può essere riscritta a:

return s1 == null ? s2 == null : s1.equals(s2); 

Questo funziona perché il contratto .equals() garantisce che per qualsiasi oggetto o, o.equals(null) è sempre false.

+3

Il codice all'interno di 'Objects.equals()' è 'return (a == b) || (a! = null && a.equals (b)); '. Immagino che questo sarebbe un modo migliore per farlo prima di Java 7 poiché è direttamente dalla bocca dei cavalli. – CKing

+2

@SashaSalauyou L'ho visto. È ironico che la tua risposta abbia ottenuto 3 downvotes quando era la più elegante. Sfortunatamente, queste cose accadono e dobbiamo andare avanti :) +1 da me se non viene eliminato – CKing

+0

@ChetanKinger il codice di 'Oggetti.equals() 'è davvero un micro-ottimizzazione a questo punto; fondamentalmente controlla prima l'uguaglianza di riferimento, che funziona per 'null' (dato che' null == null' è vero) e poi controlla che 'a' non sia nullo, nel qual caso chiama' .equals() '; il mio codice in realtà non differisce molto, davvero. E non capisco affatto il downvote. – fge

44

Da Objects.equals():

return (a == b) || (a != null && a.equals(b)); 

Molto semplice, autoesplicativo ed elegante.

+3

Mi piace. Se 'a' e' b' sono lo stesso riferimento, restituisce true immediatamente. – Navin

4

Se non è possibile utilizzare la soluzione Java 7+, ma avete Guava o Commons Lang nel classpath, quindi è possibile utilizzare il seguente:

Guava:

import com.google.common.base.Objects; 

Objects.equal(s1, s2); 

Commons Lang:

import org.apache.commons.lang3.builder.EqualsBuilder; 

new EqualsBuilder().append(s1, s2).isEquals(); 

o

0.123.
import org.apache.commons.lang3.StringUtils; 

StringUtils.equals(s1, s2); 
+1

Se stai usando Commons Lang, non ['StringUtils.equals'] (http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html# equivale a% 28java.lang.CharSequence,% 20java.lang.CharSequence% 29) ha più senso? –

+0

@BrendanLong - grazie per il suggerimento –

Problemi correlati