2010-02-23 2 views
2

Java 클래스 Rec. 나는 그것의 두 인스턴스를 가지고 Rec1과 Rec2. Rec1과 Rec2의 값이 같은지 확인하고 싶습니다. 만약 내가 Rec1.equals (Rec2) 그것을 할 올바른 방법입니까?오브젝트 비교 관련

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; 

} 

답변

3

당신은 자바 객체 평등을 구현하기 위해 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. 

는 그입니다.

+0

@arav는, 여기 당신이 읽어보십시오 관련 기사 : http://www.javapractices.com/topic/TopicAction.do?Id=17 @cletus +1 전체 답변 :) –

+3

잘 작동하지만 apache lang의 Apache EqualsBuilder 및 HashCodeBuilder http://commons.apache.org/lang/에서이 작업을 간단하게 수행 할 수 있습니다. –

+0

+1, 그걸 위해 건배 - 내가 모르는 뭔가가 존재했습니다. 나중에 내 관심사와 관련이있을 수 있습니다 :) –

0

Rec가 사용자 정의 클래스 인 경우 equals 메소드를 대체해야합니다. 그렇지 않으면 Object 클래스에서 equals 메소드를 호출하게됩니다. 같은

뭔가 :

public boolean equals(Rec x){ 
    //check here to see if the references are the same, if so return true 
    if(this == x) return true; 

    //if they aren't the same object then check all the fields for equality 
    if (category.equals(x.category) && etc etc) return true; 
    else return false; 
} 
관련 문제