web-dev-qa-db-fra.com

Comment comparer deux chaînes lorsque les deux peuvent être nulles?

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?

45
Benjy Kessler

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.

80
fge

De Objects.equals() :

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

Très simple, explicite et élégant.

44
Alex Salauyou

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);
4
Michal Kordas