1. 程式人生 > >Java重寫equals方法的錯誤——違反對稱性

Java重寫equals方法的錯誤——違反對稱性

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方法對大小寫方法敏感造成不對稱。