자바 공통 방법
7151 단어 자바
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 를 다시 불 러 왔 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.