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 à l’aide de l’opérateur == (voir cette question ). Je veux que deux chaînes soient égales si elles sont toutes 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(Ssortingng s1, Ssortingng s2) { if (s1 == null && s2 == null) { return true; } if (s1 == null || s2 == null) { return false; } return s1.equals(s2); } 

Ceci 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 renvoyé et si exactement un argument est nul, false est renvoyé. Sinon, l’égalité est déterminée en utilisant la méthode égale 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 object 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 la solution Java 7+, mais que vous avez Guava ou Commons Lang dans classpath, vous pouvez utiliser les éléments suivants:

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.SsortingngUtils; SsortingngUtils.equals(s1, s2);