equals 메서드를 재정의할 때 지켜야할 일반 규약

  1. 반사성

    1. 객체는 자기 자신과 같아야 한다
  2. 대칭성

    1. 서로에 대한 동치 여부에 똑같이 답해야 한다
      1. x.equals(y) = true 이면 y.equals(x) = true 이어야 한다.
    public final class CaseInsensitiveString {
    	private final String s;
    	
    	public CaseInsensitiveString(String s) {
    		this.s = Objects.requireNonNull(s);
    	}
    	
    	//대칭성 위배!
    	@Override public boolean equals(Object o) {
    		if(o instanceof CaseInsensitiveString)
    			return s.equalsIgnoreCase(
    				((CaseInsensitiveString) o).s);
    		if(o instanceof String) // 한 방향으로 작동
    			return s.equalsIgnoreCase((String) o);
    		return false;
    	}
    }
    
    CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
    String s = "polish";
    cis.equals(s) = true; //String의 대소문자를 비교못함
    
  3. 추이성

    1. 첫 번째 객체와 두 번째 객체가 같고, 두 번째 객체와 세번째 객체가 같다면, 첫번째 객체와 세번째 객체도 같아야 한다.
  4. 일관성

    1. 두 객체가 같다면 앞으로도 영원히 같아야 한다.
  5. null-아님

    1. 모든 객체가 null과 같지 않아야 한다.

양질의 equals 메서드 구현 방법

  1. == 연산자를 사용해 입력이 자기 자신의 참조인지 확인한다.
  2. instanceof 연산자로 입력이 올바른 타입인지 확인한다.
  3. 입력을 올바른 타입으로 형변환한다.
  4. 입력 객체와 자기 자신의 대응되는 ‘핵심’필드들이 모두 일치하는지 하나씩 검사한다.

주의 사항

  1. equals를 재정의할 땐 hashcode도 반드시 재정의하자
  2. 너무 복잡하게 해결하려 들지 말자.
  3. Object 외의 타입을 매개변수로 받는 equals 메서드는 선언하지 말자.