자바 공통 방법

7151 단어 자바
Object 의 모든 비 final 방법 (equals, hashCode, toString, clone, finalize)       오 버 라 이 드 를 위 한 디자인 입 니 다.
Equals 는 다시 쓸 필요 가 없 는 몇 가지 상황:
1     하나의 사례 는 본질 적 으로 유일한 것 이다.값 (value) 이 아 닌 활동 실 체 를 대표 하 는 클래스, 예 를 들 어 Thread.
2     하나의 클래스 가 '논리 적 동등 (logical equality)' 테스트 기능 을 제 공 했 는 지 에 관심 이 없다.예 를 들 어 자바 util. Random 은 equals 방법 을 바 꾸 었 다. 그 는 두 개의 Random 인 스 턴 스 가 똑 같은 난수 서열 을 만 들 었 는 지 검 사 했 지만 디자이너 는 고객 이 이런 기능 을 필요 로 할 것 이 라 고 생각 하지 않 았 다. 이런 상황 에서 Object 에서 계승 한 equals 가 이 루어 진 것 만으로 도 충분 하 다.
3      초 류 는 이미 equals 방법 을 바 꾸 었 고, 초 류 에서 물 려 받 은 자 류 도 적합 하 다.예 를 들 어 대부분의 set 는 AbstractSet 에서 equals 를 계승 하여 실현 되 었 고 List 는 AbstractList 에서 equals 를 계승 하여 실현 되 었 으 며 Map 은 AbstractMap 에서 equals 를 계승 하여 실현 되 었 다.
4      하 나 는 사유 적 이거 나 패키지 급 사유 적 이 며, 그의 equals 방법 이 영원히 호출 되 지 않 을 것 이 라 고 확신 할 수 있다.
   
 public boolean  equals(Object o)  {
                throw new  UnsupportedOperationException();
    }

Object. equals 는 언제 바 꿉 니까?
자신 만 의 '논리 적 상등' 개념 (대상 신분 과 다른 개념) 이 있 고 초 류 도 equals 를 바 꾸 어 기 대 를 실현 하 는 행 위 를 하지 않 았 다.
equals 를 바 꾸 는 목적: 두 지향 치 대상 의 인용 을 비교 할 때 그들 이 같은 대상 을 가리 키 는 것 이 아니 라 논리 적 으로 일치 하 는 지 알 고 싶 습 니 다.
equals 방법의 일반적인 약속 다시 쓰기:
1 .  자 반성   임의의 인용 값 X 에 대해 서 는 X. equals (X) 가 true 일 것 입 니 다.
2.    대칭 성  임의의 인용 값 X 에 대해 Y 는 Y. equals (X) 가 true 로 돌아 갈 때 만 X. equals (Y) 도 true 로 돌아 갑 니 다.
3.    전달 성  임의의 인용 값 X, Y, Z  X. equals (Y) 가 true 로 돌아 가 고 Y. equals (Z) 도 true 로 돌아 갈 때 X. equals (Z) 도 true 로 돌아 가 야 합 니 다.
4.    일치 성  임의의 인용 값 X 와 Y 에 대해 equals 비교 에 사용 할 대상 정보 가 수정 되 지 않 았 다 면 X. equals (Y) 를 여러 번 호출 하거나 true 로 일치 하거나 false 로 일치 하 게 되 돌려 줍 니 다.
5.     임의의 비 어 있 는 인용 값 X 에 대해 서 는 X. equals (null) 가 false 로 되 돌아 갑 니 다.
대칭 성:
예 를 들 면:
              
Public   final class  CaseInsensitveString  {
                       private  final   String  s ;
                     public  CaseInsensitveString  (String  s){
                          if(s==null) throw new NullPointerException();
                          this.s=s;
                     }
                @override  public boolean equals(Object o) {
                       if(o instance of CaseInsensitveString )
                              return  s.equalsIgnore(((CaseInsensitveString)o).s);
                         if(o instanceof String)
                               return s.equalsIgnoreCase((String)o);
                             retrun false;
                }
             …
           }

대소 문 자 를 구분 하지 않 는 문자열 과 일반적인 문자열 을 가정 합 니 다.
CaseInsensitveString   cis =new CaseInsensitveString  ("Polish");
String p ="polish";
이 때 cis. equals (p) 는 true 로 되 돌아 가지 만 String 클래스 에서 equals 는 대소 문 자 를 구분 하 는 문자열 을 모 르 기 때문에 s. equals (p) 는 false 로 되 돌아 가 대칭 성 을 위반 합 니 다.
그래서 상술 한 방법 을 재 구성 할 수 있다.
           
  @override  public boolean equals(Object o) {
                     return o instanceof CaseInsensitveString  &&((CaseInsensitveString  )o).s.equalsIgnoreCase(s); 
             }

전달 성: 만약 에 한 대상 이 두 번 째 대상 과 같 고 두 번 째 대상 이 세 번 째 대상 과 같다 면 첫 번 째 대상 은 반드시 세 번 째 대상 과 같다.
부모 클래스 와 하위 클래스 의 경우 하위 클래스 는 새로운 값 구성 요 소 를 부모 클래스 에 추가 하면 하위 클래스 가 추가 한 정 보 는 equals 의 비교 결과 에 영향 을 줄 수 있 습 니 다.
                   
    public  class Point() {
                            private    final    int x;
                            private    final    int y;
                            public Point(int x,int y) {
                                  this.x=x;
                                  this.y=y;
                            }
                       @override public boolean equals(Object o) {
                              if(!(o instanceof Point ))
                                       return false ;
                              Point p =(Point)o;
                         retrun p.x==x&&p.y==y;
                     }
                     …
                 }   
                public class ColorPoint extends Point {
                     private  final Color color ;
                 public ColorPonit(int x,int y,Color color) {
                    super(x,y);
                    this color =color;
               }
           ….
        }

이 코드 에서 equals 는 Point 를 비교 하고 점 의 색 을 무시 합 니 다...다음으로 변경:
 
 @override public boolean equals(Object o) {
                              if(!(o instanceof ColorPoint ))
                                       return false ;
                            retrun super.equals(o)&&((ColorPoint)o).color==color;
                     }

이러한 상황 에서 유색 점 과 보통 점 을 비교 하고 반대 되 는 상황 에서 false 로 돌아 갑 니 다. 예 를 들 어:
true  cp. equals (p) 가 false 를 되 돌려 대칭 성 을 위반 하 였 습 니 다.
 
Point   p= new Point(1,2);
ColorPoint cp =new ColorPoint(1,2,Color.red);
p.equals(cp)

전달 성 을 위반 했다.
해결 방법: 추상 적 인 (abstract) 클래스 의 하위 클래스 에 새로운 값 구성 요 소 를 추가 합 니 다.
추상 적 인 Shape 클래스 입 니 다. 그 는 값 구성 요소 가 없습니다. Circle 하위 클래스 는 radius 필드 를 추 가 했 습 니 다. Rectangle 하위 클래스 는 length 와 width 필드 를 추 가 했 습 니 다. 부모 클래스 의 인 스 턴 스 를 직접 만 들 지 않 으 면 equals 를 사용 하여 하위 클래스 의 인 스 턴 스 를 비교 할 수 있 습 니 다.
일치 성: 만약 두 대상 이 같다 면 그들 중 한 명 이나 두 명 이 모두 수정 되 지 않 는 한 항상 똑 같이 유지 해 야 한다.당신 이 종 류 를 쓸 때 이런 종류 가 변 하지 않 는 것 인지 아 닌 지 를 고려 해 야 합 니 다. 만약 그 가 변 하지 않 는 다 면 equals 방법 이 같은 대상 을 만족 시 키 는 것 은 영원히 같 아야 합 니 다. 같 지 않 은 것 은 영원히 같 지 않 습 니 다.
비 공 성: 모든 대상 은 null 과 같 지 않 아야 합 니 다. equals 방법 은 instanceof 연산 자 를 사용 하여 매개 변수 가 정확 한 유형 인지 확인 해 야 합 니 다.
                 
 @override public boolean equals(Object o) {
                              if(!(o instanceof  Point ))
                                       return false ;
                             if(!(o instanceof ColorPoint))
                                     return o.equals(this);
                            retrun super.equals(o)&&((ColorPoint)o).color==color;
                     }

Point   p1= new Point(1,2);
ColorPoint p2 =new ColorPoint(1,2,Color.red);
ColorPoint p3 =new ColorPoint(1,2,Color.blue);
P1.equals(p2); true
P1.equals(p3);true;
P2.equals(p3);false;

총괄 실현 equals 방법:
1. "= ="연산 자 를 사용 하여 "매개 변수 가 이 대상 의 참조 인지 확인 합 니 다."그렇다면 true 로 돌아 갑 니 다.
2. instanceof 연산 자 를 사용 하여 '인자 가 정확 한 유형 인지' 를 검사 합 니 다.아니면 false 로 돌아 갑 니 다.
3. 매개 변 수 를 정확 한 유형 으로 바 꿉 니 다.
4. 이 클래스 의 모든 '관건 도 메 인' 에 대해 매개 변수 가 해당 대상 에 대응 하 는 도 메 인 과 일치 하 는 지 확인 합 니 다.
메모: equals 성명 의 Object 대상 을 다른 형식 으로 바 꾸 지 마 십시오.
Public boolean equals(MyClass  o) {
...
} 이 방법 은 Object. equals 를 다시 쓰 지 않 았 습 니 다. 매개 변 수 는 Object 형식 일 것 이 고 반대로 Object. equals 를 다시 불 러 왔 습 니 다.

좋은 웹페이지 즐겨찾기