사용자 도구

사이트 도구


java:equals_hashcode

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
마지막 판 양쪽 다음 판
java:equals_hashcode [2017/07/04 00:57]
kwon37xi [동치(equivalence)를 위반해서는 안된다]
java:equals_hashcode [2017/07/04 01:02]
kwon37xi [동치 문제의 최종 해결책 canEqual]
줄 1: 줄 1:
 ====== Java equals & hashCode ====== ====== Java equals & hashCode ======
-  * [[java:equals_verifier|Equals Verifier]]+  * [[java:equals_verifier|Equals Verifier]] ''equals'', ''hashCode'' 테스트 자동화
   * [[java:hibernate:equalsandhashcode|Hibernate and equals & hashCode]]   * [[java:hibernate:equalsandhashcode|Hibernate and equals & hashCode]]
  
줄 33: 줄 33:
  
   * 반사성(reflexive) : null이 아닌 x에 대해 ''x.equals(x)''는 항상 ''true''여야 한다.   * 반사성(reflexive) : null이 아닌 x에 대해 ''x.equals(x)''는 항상 ''true''여야 한다.
-  * 대칭성(symmetric) : null이 아닌 x, y에 대해, 오직 ''y.equals(x)''가 ''true''일 때만 ''x.equals(y)''도 ''true''여야 한다. +  * 대칭성(symmetric) : null이 아닌 x, y에 대해, 오직 ''y.equals(x)''가 ''true''일 때만 ''x.equals(y)''도 ''true''여야 한다. [[https://github.com/kwon37xi/research-java8/blob/master/java-8-others/src/main/java/equality/no_equivalance_relation/NoSymmetricColoredPoint.java|대칭성 위반 예]] 
-  * 이행성(transitive) : null이 아닌 x,y,z에 대해, ''x.equals(y)''가 ''true''이고 ''y.equals(z)''가 ''true''이면 ''x.equals(z)''도 ''true''여야 한다.+  * 이행성(transitive) : null이 아닌 x,y,z에 대해, ''x.equals(y)''가 ''true''이고 ''y.equals(z)''가 ''true''이면 ''x.equals(z)''도 ''true''여야 한다. [[https://github.com/kwon37xi/research-java8/blob/master/java-8-others/src/main/java/equality/no_equivalance_relation/NoTransientColoredPoint.java|이행성 위반 예]]
   * 일관성(consistent) : null이 아닌 x, y에 대해, 객체의 동등성 비교에 사용된 정보에 변경이 없다면 ''x.equals(y)''를 여러번 호출해도 일관성있게 ''true''를 반환하거나 일관성있게 ''false''를 반환해야 한다.   * 일관성(consistent) : null이 아닌 x, y에 대해, 객체의 동등성 비교에 사용된 정보에 변경이 없다면 ''x.equals(y)''를 여러번 호출해도 일관성있게 ''true''를 반환하거나 일관성있게 ''false''를 반환해야 한다.
   * null이 아닌 값 x 에 대해 ''x.equals(null)''은 항상 ''false''를 반환해야 한다.   * null이 아닌 값 x 에 대해 ''x.equals(null)''은 항상 ''false''를 반환해야 한다.
 +  * [[https://github.com/kwon37xi/research-java8/blob/master/java-8-others/src/main/java/equality/no_equivalance_relation/WrongStrictPoint.java|상속관계에 지나치게 엄격 한 예]]
  
 상속 관계에서는 위 동치성을 쉽게 위반하게 된다. ''canEqual'' 메소드를 통해 이를 지켜내야 한다. 상속 관계에서는 위 동치성을 쉽게 위반하게 된다. ''canEqual'' 메소드를 통해 이를 지켜내야 한다.
줄 58: 줄 59:
     if (other instanceof Point) {     if (other instanceof Point) {
         Point that = (Point) other;         Point that = (Point) other;
-        // that.canEqual(this) 가 핵심이다. 이를 거꾸로 면 안된다.+        // that.canEqual(this) 가 핵심이다. 이를 거꾸로 this.canEqual(that) 으로 사용하면 안된다.
         result = (that.canEqual(this) && this.getX() == that.getX() && this.getY() == that.getY());         result = (that.canEqual(this) && this.getX() == that.getX() && this.getY() == that.getY());
     }     }
줄 76: 줄 77:
  
 // that.canEqual(this) 호출을 통해서 상위클래스(Point)는 결코 ColoredPoint와 같을 수 없게 보장됨. // that.canEqual(this) 호출을 통해서 상위클래스(Point)는 결코 ColoredPoint와 같을 수 없게 보장됨.
-@Override public boolean canEqual(Object other) {+@Override  
 +public boolean canEqual(Object other) {
     return (other instanceof ColoredPoint);     return (other instanceof ColoredPoint);
 } }
java/equals_hashcode.txt · 마지막으로 수정됨: 2017/07/04 01:06 저자 kwon37xi