Java重寫equals方法的錯誤——違反對稱性
阿新 • • 發佈:2018-12-21
Java對重寫equals方法有一些約定,其中一條就是要求對稱性,即ab返回true,ba也要返回true。下面的例子就是重寫所範的錯誤。
程式碼:
public final class CaseInsensitiveString { private final String s; public CaseInsensitiveString(String s) { this.s = Objects.requireNonNull(s); } @Override public boolean equals(Object obj) { if(obj instanceof CaseInsensitiveString) { return s.equalsIgnoreCase(((CaseInsensitiveString) obj).s); } if(obj instanceof String) { return s.equalsIgnoreCase(((String)obj)); } return false; } }
public class Test {
public static void main(String[] args) {
CaseInsensitiveString cis=new CaseInsensitiveString("Polish");
String s="polish";
System.out.println(cis.equals(s));//true
System.out.println(s.equals(cis));//false
}
}
測試結果
true false
結論
CaseInsensitiveString 的equals方法對大小寫不敏感,String的equals方法對大小寫方法敏感造成不對稱。