Je suis conscient qu'il est préférable d'appeler la méthode equals
en utilisant le ==
opérateur (voir cette question ). Je veux que deux chaînes soient égales si elles sont toutes les deux nulles ou si elles représentent la même chaîne. Malheureusement, la méthode equals
lancera un NPE
si les chaînes sont null
. Mon code est actuellement:
boolean equals(String s1, String s2) {
if (s1 == null && s2 == null) {
return true;
}
if (s1 == null || s2 == null) {
return false;
}
return s1.equals(s2);
}
C'est inélégant. Quelle est la bonne façon d'effectuer ce test?
Si Java 7+, utilisez Objects.equals()
; sa documentation spécifie explicitement que:
[...] si les deux arguments sont nuls, true est retourné et si exactement un argument est null, false est retourné. Sinon, l'égalité est déterminée en utilisant la méthode equals du premier argument.
c'est ce que tu veux.
Si vous ne le faites pas, votre méthode peut être réécrite pour:
return s1 == null ? s2 == null : s1.equals(s2);
Cela fonctionne parce que le contrat .equals()
garantit que pour tout objet o
, o.equals(null)
est toujours faux.
De Objects.equals()
:
return (a == b) || (a != null && a.equals(b));
Très simple, explicite et élégant.
Si vous ne pouvez pas utiliser Java 7+, mais que vous avez Guava ou Commons Lang dans classpath, vous pouvez utiliser ce qui suit:
Goyave:
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();
ou
import org.Apache.commons.lang3.StringUtils;
StringUtils.equals(s1, s2);