당신은 자바 객체 평등을 구현하기 위해 equals()
및 hashCode()
메소드를 구현해야합니다
class Rec {
private BigDecimal recordId = null;
private BigDecimal recSubNum = null;
private BigDecimal FileId = null;
private String category = null;
private BigDecimal status = null;
private BigDecimal errorCode = null;
@Override
public int hashCode() {
int ret = 41;
ret = hc(ret, recordId);
ret = hc(ret, recSubNum);
ret = hc(ret, fieldId);
ret = hc(ret, category);
ret = hc(ret, status);
ret = hc(ret, errorCode);
return ret;
}
@Override
public boolean equals(Object ob) {
if (ob == null) return false;
if (ob.getClass() != Rec.class) return false;
Rec r = (Rec)ob;
if (!eq(r.recordId, record)) return false;
if (!eq(r.recSubNum, recSubNum)) return false;
if (!eq(r.fileId, fileId)) return false;
if (!eq(r.category, category)) return false;
if (!eq(r.status, status)) return false;
if (!eq(r.errorCode, errorCode)) return false;
return true;
}
private static boolean eq(Object ob1, Object ob2) {
return ob1 == null ? ob2 == null : ob1.equals(ob2);
}
private static int hc(int hc, Object field) {
return field == null ? hc : 43 + hc * field.hashCode();
}
}
참고 : Java 용 같음/해시 코드 계약 즉, 두 객체 a와 b에 대한 :
a.equals(b) == b.equals(a)
두 개체가 동일하면 a.hashCode()
이 01이어야합니다..
편집 : 유형이 일치하는지 확인하는 두 가지 방법이 있습니다. 다음 중 하나를
if (ob == null) return false;
if (ob.getClass() != Rec.class) return false;
또는이 두
if (!(ob instanceof Rec)) return false;
은 다른 일을하고 당신은 당신이 원하는 무슨에 따라 올바른 하나를 선택해야합니다. 나는 당신이 두 번째가 필요하다는 것을 알지 않는 한 일반적으로 첫 번째 것을 선호한다. 차이점이 뭐야?
class A {
public int i;
public boolean equals(Object ob) {
if (!(ob instanceof A)) return false;
return i == ((A)ob).i;
}
}
합리적으로 보입니까? 수업이 확장되면 어떻게 되나요?
class B extends A {
public int j;
public boolean equals(Object ob) {
if (!(ob instanceof B)) return false;
if (!super.equals(ob)) return false;
return j == ((B)ob).j;
}
}
여전히 합리적인 것처럼 보입니까? 깨졌어. 정말 평등을 하위 클래스로 원하는 하지 않는 한 내가 instanceof
이상 getClass()
을 선호하는 이유
A a = new A();
a.i = 10;
B b = new B();
b.i = 10;
b.j = 20;
System.out.println(a.equals(b)); // true! Is this really what you want?
System.out.println(b.equals(a)); // false! Different to previous = problem.
는 그입니다.
@arav는, 여기 당신이 읽어보십시오 관련 기사 : http://www.javapractices.com/topic/TopicAction.do?Id=17 @cletus +1 전체 답변 :) –
잘 작동하지만 apache lang의 Apache EqualsBuilder 및 HashCodeBuilder http://commons.apache.org/lang/에서이 작업을 간단하게 수행 할 수 있습니다. –
+1, 그걸 위해 건배 - 내가 모르는 뭔가가 존재했습니다. 나중에 내 관심사와 관련이있을 수 있습니다 :) –