equals () 방법의 재 작성

5441 단어 equals()
문장
 
1. 왜 equals () 방법 을 다시 써 야 합 니까?
두 대상 이 논리 적 으로 동일 한 지 여 부 를 판단 합 니 다. 예 를 들 어 클래스 의 구성원 변수 에 따라 두 가지 인 스 턴 스 가 동일 한 지 여 부 를 판단 하고 Object 의 equals 방법 을 계승 하여 두 인용 변수 가 같은 대상 인지 아 닌 지 를 판단 할 수 있 습 니 다.이렇게 하면 우 리 는 종종 equals () 방법 을 다시 써 야 한다.
우리 가 중복 대상 이 없 는 집합 에 요 소 를 추가 할 때 집합 에 저 장 된 것 은 종종 대상 이다. 우 리 는 먼저 집합 에 이미 알 고 있 는 대상 이 존재 하 는 지 판단 해 야 한다. 그러면 반드시 equals 방법 을 다시 써 야 한다.
 
 
2. equals () 방법 을 어떻게 다시 씁 니까?
  • equals 방법 을 다시 쓰 는 요구: 1. 자 반 성: 빈 인용 x, x. equals (x) 는 true 로 돌아 가 야 합 니 다.2. 대칭 성: 모든 인용 x 와 y 에 대해 x. equals (y) 가 true 로 돌아 가면 y. equals (x) 도 true 로 돌아 가 야 합 니 다.3. 전달 성: 모든 인용 x, y, z 에 대해 x. equals (y) 가 true 로 돌아 가면 y. equals (z) 가 true 로 돌아 가면 x. equals (z) 도 true 로 돌아 가 야 합 니 다.4. 일치 성: x 와 y 가 인용 한 대상 이 변화 가 없 으 면 x. equals (y) 를 반복 적 으로 호출 하면 같은 결 과 를 되 돌려 야 합 니 다.5. 비 공 성: 임의의 비 공 인용 x, x. equals (null) 는 false 로 돌아 가 야 합 니 다.

  • 형식:
    public boolean equals(Object obj) {
        if(this == obj)
            return false;
        if(obj == null)
            return false;
        if(getClass() != obj.getClass() )
            return false;
        MyClass other = (MyClass)obj;
        if(str1 == null) {
             if(obj.str1 != null) {
                  return false;
             }
        }else if (!str1.equals(other.str1) )
                 return false;
         }
        if(var1 != other.var1)
            return false;
        return true;
    }

     하위 클래스 에 새로운 특성 을 추가 하고 equals 방법 을 유지 하면 복잡 하 다.
     
     
     
    이어서 우 리 는 실례 를 통 해 위의 약속 을 이해한다.우 리 는 먼저 간단 하고 가 변 적 이지 않 은 2 차원 클래스 로 시작 합 니 다: Public class Point {private final int x; private final int y; Public Point (int x, int y) {this. x = x; this. y = y;} Public boolean equals (Object o) {if (! (o instanceof Point))return false; Point p = (Point) o; return p. x = x & & p. y = = y;}} 이 종 류 를 확장 하려 면 점 에 색상 정 보 를 추가 하 십시오: Public class ColorPoint extends Point {private Color color; public ColorPoint (int x, int y, Color color) {super (x, y); this. color = color;}//override equasl () public boolean equals (Object o) {if (! (o instanceof ColorPoint)) return false; ColorPoint cp = (ColorPoint) o; return super. equals (o) & & cp. color = = = color;} 우 리 는 equals 방법 을 다시 썼 습 니 다.실제 인삼 이 다른 유색 점 이 고 같은 위치 와 색 을 가지 고 있 을 때 만 true 로 돌아 갑 니 다.그러나 이 방법의 문 제 는 일반적인 점 과 유색 점, 그리고 거꾸로 된 상황 을 비교 할 때 서로 다른 결 과 를 얻 을 수 있다 는 점 이다. Public static void main (String [] args) {Point p = new Point (1, 2), ColorPoint cp = new ColorPoint (1, 2, Color. RED), System. out. println (p. equals (cp), System. out. println(cp. eqauls (p);} 실행 결과: true   false 와 같은 결 과 는 대칭 성 을 위반 한 것 이 분명 합 니 다. 이러한 시 도 를 통 해 이 문 제 를 수정 할 수 있 습 니 다. ColorPoint. equals 가 '혼합 비교' 를 할 때 색상 정 보 를 무시 하도록 할 수 있 습 니 다. Public boolean equals (Object o) {if (! (o instanceof Point) return false;/o 가 일반적인 점 이 라면 색상 정보 if (!(o instanceof ColorPoint) return o. equals (this);/o 가 유색 점 이 라면 ColorPoint cp = (ColorPoint) o; return super. equals (o) & & cp. color = = color;} 이 방법의 결 과 는 어떻게 될 까? 먼저 테스트 해 보 자: Public static void main (String [] args){   ColorPoint p1 = new ColorPoint(1, 2, Color.RED);   Point p2 = new Point(1, 2);   ColorPoint p3 = new ColorPoint(1, 2, Color.BLUE);   System.out.println(p1.equals(p2));   System.out.println(p2.equals(p1));   System.out.println(p2.equals(p3));   System.out.println(p1.eqauls(p3)); }실행 결과: true true false 라 는 방법 은 대칭 성 을 제공 하 였 으 나 전달 성 을 희생 하 였 습 니 다 (약속대로 p1. equals (p2) 와 p2. eqauals (p3) 는 모두 true 로 돌아 가 고 p1. equals (p3) 도 true 로 돌아 가 야 합 니 다). 어떻게 해결 해 야 합 니까?
     
    사실 이것 은 대상 언어 에서 등가 관계 에 관 한 기본 적 인 문제 입 니 다. 실례 화 가능 한 종 류 를 확장 하 는 동시에 새로운 특징 을 추가 하 는 동시에 equals 약속 도 유지 해 야 합 니 다. 간단 한 방법 은 없습니다. 새로운 해결 방법 은 ColorPoint 가 Point 를 확장 하지 않 고 ColorPoint 에 개인 적 인 Point 를 추가 하 는 것 입 니 다.도 메 인, 그리고 공유 보기 (view) 방법: Public class ColorPoint {private Point point; private Color color; public ColorPoint (int x, int y, Color color) {point = new Point (x, y); this. color = color;}//이 유색 점 과 같은 위치 에 있 는 일반 Point 대상 Public Point asPoint () {return point;} public boolean equals (Object o) {if (o = = this) return true; if (! (o instanceof ColorPoint) return false; ColorPoint cp = (ColorPoint)o; return cp. point. equals (point) & cp. color. equals (color);}} 또 다른 해결 방법 은 Point 를 추상 적 인 클래스 (abstract class) 로 설계 하 는 것 이다.이렇게 하면 이 추상 류 의 하위 클래스 에 새로운 특징 을 추가 할 수 있 습 니 다. equals 약속 을 위반 하지 않 습 니 다. 추상 류 는 클래스 의 인 스 턴 스 를 만 들 수 없 기 때문에 앞에서 말 한 여러 가지 문제 가 발생 하지 않 습 니 다. equals 방법 을 다시 쓰 는 요점: 1. 사용 = = 연산 자 는 '실제 참조 가 대상 을 가리 키 는 참조 인지' 를 검사 합 니 다.
    2. 실제 인삼 이 null 인지 판단 3. 인 스 턴 스 of 연산 자 를 사용 하여 '실제 인삼 이 정확 한 유형 인지' 확인 합 니 다. 4. 실제 인삼 을 정확 한 유형 으로 전환 합 니 다. 5. 이 클래스 의 모든 '관건' 에 대해도 메 인, 실제 인삼 의 도 메 인 이 현재 대상 에 대응 하 는 도 메 인 값 과 일치 하 는 지 확인 합 니 다. float 도 더 블 도 메 인 이 아 닌 기본 유형의 도 메 인 에 대해 서 는 = 연산 자 를 사용 하여 비교 할 수 있 습 니 다. 대상 참조 유형의 도 메 인 에 대해 서 는 인용 대상 의 equals 방법 을 재 귀적 으로 호출 할 수 있 습 니 다. float 유형의 도 메 인 에 대해 서 는 Float. float ToIntBits 를 사용 하여 전환 할 수 있 습 니 다.int 형식의 값 으로 바 꾼 다음 = = 연산 자 를 사용 하여 int 형식의 값 을 비교 합 니 다. double 형식의 도 메 인 에 대해 서 는 Double. double ToLongBits 를 사용 하여 log 형식의 값 으로 바 꾼 다음 = = 연산 자 를 사용 하여 log 형식의 값 을 비교 합 니 다. 6. equals 방법 을 작성 한 후에 세 가지 질문 을 해 야 합 니 다. 대칭 적 이 고 전달 적 이 며 하나의 값 인지 물 어 봐 야 합 니 다.치? (다른 두 가지 특성 은 일반적으로 스스로 만족 합 니 다) 답 이 부정 적 이 라면 이러한 특성 이 만족 하지 못 하 는 원인 을 찾 아 equals 방법의 코드 를 수정 하 십시오.

    좋은 웹페이지 즐겨찾기