java equals() 메서드 덮어쓰기 - 작동하지 않음
이 문제에 대해 흥미로운(그리고 매우 불만족스러운) 문제에 부딪혔습니다.equals()그 때문에, 잘 테스트되고 있다고 생각되는 클래스가 크래쉬 해 버그를 찾아내는데 오랜 시간이 걸렸습니다.
완성도를 높이기 위해 IDE나 디버거를 사용하지 않고 구식 텍스트 에디터와 시스템만 사용했습니다.시간이 너무 촉박해서 학교 과제였어요.
어쨌든...
저는 물건을 넣을 수 있는 기본적인 쇼핑 카트를 개발하고 있었습니다.를 실장하기 위해서addBook(),removeBook() , , , , 입니다.hasBook(), 카트의 방법, 카트의 방법, 카트의 방법, 카트의 방법, 카트의 사용법, 카트의 사용법, 카트의 사용법, 카트의 사용법, 카트의 사용법을 Book Cart 가보겠습니다
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
테스트에서는 모두 정상적으로 동작.나는 6개의 오브젝트를 만들고 그것들을 데이터로 채운다.add, remove() 은 add, , has()에서 합니다.Cart모든 게 잘 풀려요나는 당신이 가질 수 있다고 읽었지만, 그것은 효과가 있었기 때문에 크게 중요하지 않다고 생각했다.
요. '만들다'를 요.그때, 저는 이 문제를 만들 필요가 있었습니다.Book만을 가지고 반대하다ID책 수업에서 배운 내용입니다.하다츠키다
public boolean hasBook(int i) {
Book b = new Book(i);
return hasBook(b);
}
public boolean hasBook(Book b) {
// .. more code here
return this.books.contains(b);
}
★★★★★★★★★★★★★★★★★★★★★★.equals(Book b)이치노 없이 하는 데 오랜 또, 「Debugger」는 「Debugger」를 하고 있습니다.Cart클래스가 올바르게 테스트되고 올바르게 되었습니다. 후 " " "equals() 지정합니다.
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
모든 것이 다시 작동하기 시작했다.Book 파라미터가 명백한데도 메서드가 Book 파라미터를 취하지 않기로 결정한 이유가 있습니까?Book 오브젝트?유일한 차이점은 동일한 클래스 내에서 인스턴스화되어 하나의 데이터 멤버로 채워졌다는 것입니다.나는 매우 혼란스럽다.불불????
'''가equals()계 method에서 Object 말합니다
public boolean equals(Object other);
는 즉, 개, 매, 매, 매, 매, 니이다 타입이어야 합니다.Object이를 덮어쓰기라고 합니다.public boolean equals(Book other)에의 오버로드라고 불리는 것을 실행합니다.equals()★★★★★★ 。
ArrayList된 용도를 equals()를 들어, 그 내용 방법)contains() ★★★★★★★★★★★★★★★★★」equals()메서드), 오버로드되지 않습니다.대부분의 코드에서 제대로 오버라이드되지 않은 코드를 호출하는 것은Object was ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '와 호환성이 없습니다.ArrayList.
따라서 메서드를 올바르게 재정의하지 않으면 문제가 발생할 수 있습니다.
매번 다음과 같은 값을 덮어씁니다.
@Override
public boolean equals(Object other){
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof MyClass)) return false;
MyClass otherMyClass = (MyClass)other;
...test other properties here...
}
의 사용방법@Override주석은 어리석은 실수에도 많은 도움을 줄 수 있다.
슈퍼 클래스' 또는 인터페이스의 메서드를 덮어쓰고 있다고 생각될 때마다 사용하십시오.이렇게 하면 컴파일 오류가 발생합니다.
일식을 사용하는 경우 맨 위 메뉴로 이동합니다.
소스 --> 등호() 및 해시 코드() 생성
질문의 주제를 약간 벗어났지만, 어쨌든 언급할 가치가 있습니다.
Commons Lang은 등호나 해시 코드를 덮어쓰는 데 사용할 수 있는 몇 가지 훌륭한 방법을 가지고 있습니다.EqualsBuilder.reflectionEquals(...) 및 HashCodeBuilder.reflectionHashCode(...)를 확인합니다.과거에 많은 두통을 덜어주었습니다.물론 ID에 대해 "균등"을 하고 싶을 뿐이라면 당신의 상황에 맞지 않을 수도 있습니다.
또, 이 기능을 사용하는 것에 동의하고 있습니다.@Override(또는 다른 방법을 덮어쓸 때마다) 주석을 추가합니다.
보일러 플레이트 코드를 저장하는 또 다른 빠른 솔루션은 Lombok Equals And Hash Code 주석입니다.쉽고 우아하며 맞춤이 가능합니다.IDE에 의존하지 않습니다.예를 들어,
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(of={"errorNumber","messageCode"}) // Will only use this fields to generate equals.
public class ErrorMessage{
private long errorNumber;
private int numberOfParameters;
private Level loggingLevel;
private String messageCode;
동등하게 사용할 필드를 사용자 정의하려면 사용 가능한 옵션을 참조하십시오.Lombok은 먹음직스럽다.제공된 범위로 추가합니다.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.14.8</version>
<scope>provided</scope>
</dependency>
Android Studio에서는 alt + insert ---> equals 및 hashCode 입니다.
예제:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Proveedor proveedor = (Proveedor) o;
return getId() == proveedor.getId();
}
@Override
public int hashCode() {
return getId();
}
고려사항:
Object obj = new Book();
obj.equals("hi");
// Oh noes! What happens now? Can't call it with a String that isn't a Book...
그instanceOfstatement는 대등함을 구현하기 위해 자주 사용됩니다.
이것은 인기 있는 함정입니다!
문제는 이 기능을 사용하는 것입니다.instanceOf대칭의 법칙을 위반합니다.
(object1.equals(object2) == true) 만약이라면 (object2.equals(object1))
첫 번째 등호가 true이고 obj1이 속한 클래스의 서브클래스의 인스턴스 obj1이면 두 번째 등호가 false를 반환합니다.
ob1이 속하는 간주 클래스가 final로 선언되면 이 문제는 발생하지 않지만 일반적으로 다음과 같이 테스트해야 합니다.
this.getClass() != otherObject.getClass();그렇지 않으면 false를 반환하고 그렇지 않으면 필드를 테스트하여 동일성을 비교합니다.
recordId는 객체의 속성입니다.
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Nai_record other = (Nai_record) obj;
if (recordId == null) {
if (other.recordId != null)
return false;
} else if (!recordId.equals(other.recordId))
return false;
return true;
}
언급URL : https://stackoverflow.com/questions/185937/overriding-the-java-equals-method-not-working
'programing' 카테고리의 다른 글
| Android로 파일을 다운로드하고 진행 상황을 ProgressDialog로 표시 (0) | 2022.06.11 |
|---|---|
| C++ 코드를 C로 변환하는 방법 (0) | 2022.06.11 |
| 문자열의 특정 인덱스에 있는 문자를 바꾸시겠습니까? (0) | 2022.06.11 |
| 한 번에 여러 개의 값을 구조체에 할당하는 방법 (0) | 2022.06.10 |
| 날짜 오브젝트를 일정관리 오브젝트로 변환 (0) | 2022.06.10 |