2010-01-22 2 views
3

저는 C++ 배경 출신으로 오늘은 Java를 시작했습니다. 몇 명의 데이터 멤버가있는 클래스가 있다고 가정 해보십시오. 예를 들어 : 결과는 "그들은 동일하지"입니다 여기자바에서 회원 현명한 비교를 구현하려면 어떻게해야합니까?

Person john = new Person("john", "doe"); 
Person johndoe = new Person("john", "doe"); 
if (john == johndoe) { 
    System.out.println("They are Equal"); 
} else { 
    System.out.println("They are NOT Equal"); 
} 

:

public class Person { 
    //Constructors/Destructor 
    public Person(String strFirstName, String strLastName) { 
     m_strFirstName = strFirstName; 
     m_strLastName = strLastName; 
     m_strFullName = m_strFirstName + m_strLastName; 
    } 

    //Getters 
    public String GetFullName() { return m_strFullName; } 
    public String GetFirstName() { return m_strFirstName; } 
    public String GetLastName() { return m_strLastName; } 

    //Private Data Members 
    private String m_strFirstName; 
    private String m_strLastName; 
    private String m_strFullName; 
} 

지금 내가 이렇게 말할 수 있습니다. Java가 참조 (메모리 주소)를 비교하고 있으며 메모리의 다른 위치에 있기 때문에 테스트가 실패하기 때문에이 점을 이해합니다. Java가 연산자 오버로딩을 지원하지 않는다는 것을 읽었으므로 연산자 ==를 오버로드 할 수 없으므로 memberwise 비교를 구현하기 위해 재정의 할 메소드가 있습니까? object.equals 메소드는 유망 해 보였지만,이 메소드를 오버라이드 (override)하는 것은 나쁜 습관이라고 읽었습니다.

업데이트 : 오클라호마는 오버라이드가 동일하다고 확신합니다. 그 기사가 나쁘다는 것을 발견 할 수 없습니다. 도움을 주셔서 감사합니다. 자바를 배우면서 더 많은 질문을 할 것입니다 !!

답변

6

당신은 할 수 :

public class Person { 
    private String firstName; 
    private String lastName; 
    private String fullName; 

    public Person(String firstName, String lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.fullName = firstName + lastName; 
    } 

    public String getFirstName() { return firstName; } 
    public String getLastName() { return lastName; } 
    public String getFullName() { return fullName; } 

    @Override 
    public boolean equals(Object ob) { 
    if (ob == null) return false; 
    if (ob.getClass() != getClass()) return false; 
    Person other = (Person)ob; 
    if (!firstName.equals(other.firstName)) return false; 
    if (!lastName.equals(other.lastName)) return false; 
    if (!(fullName.equals(other.fullName)) return false; 
    return true; 
    } 

    @Override 
    public int hashCode() { 
    return firstName.hashCode()^lastName.hashCode()^fullName.hashCode(); 
    } 
} 

두 가지주의 할 :

if (john.equals(johndoe)) { 
    ... 
} 

하고 개체에 equals() 메소드를 구현

  1. C보다 위의 더 Java 스타일 ++ -스타일. Java 코딩시 Java 코딩 규칙을 채택하는 것이 좋습니다. Java를 처음 사용하는 사용자는 새로운 Java를 사용해보십시오.
  2. Java는 equals/hashCode 계약을 사용합니다. 즉, 두 객체가 동일하면 해시 코드 이어야합니다.
+0

나는 당신이 equals를 오버라이드한다고 생각하지 않는다고 읽었지 만, 왜 안 보이는지 모르겠다 .... 나는 그 기사를 다시 찾아서 게시하려고 노력할 것이다. 평등은 나에게 올바른 길처럼 보일 것입니다. – cchampion

+1

당신은 100 % 절대적으로 equals를 오버라이드하기로되어 있습니다. – danben

+0

위의 코드는 완벽한 이름 필드와 성을 추가하여 전체 이름을 비교할 필요가 없다고 생각한다는 점을 제외하고는 완벽합니다. –

관련 문제