나는 equals()
오늘 시험 법 에 대한 흥미롭고 매우 실망스러운 문제 에 부딪쳤다.
완벽 함을 위해 IDE 또는 디버거를 사용하지 않았습니다. 좋은 구식 텍스트 편집기와 System.out입니다. 시간은 매우 제한되어 있었고 학교 프로젝트였습니다.
어쨌든-
나는 포함 할 수있는 기본적인 쇼핑 카트를 개발하고 ArrayList
의 Book
객체 . 구현하기 위해 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 개의 객체를 만들어 데이터로 채 웁니다. 에 대해 많은 추가, 제거, has () 작업을 수행하면 Cart
모든 것이 잘 작동합니다. 나는 당신 이 equals(TYPE var)
또는equals(Object o) { (CAST) var }
하지만이 작동 된 이후, 너무 많이 중요하지 않았다 것으로 가정.
그럼 난 문제로 실행 - 내가 만드는 데 필요한 Book
와 개체를 만ID
Book 클래스 내에서한다. 다른 데이터는 입력되지 않습니다. 기본적으로 다음과 같습니다.
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)
방법이 더 이상 작동하지 않습니다. 좋은 디버거없이 추적하는 데 시간이 오래 걸렸으며 Cart
클래스가 올바르게 테스트되고 수정 되었다고 가정합니다 . equals()
다음과 같은 방법으로 스와핑 한 후 :
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
모든 것이 다시 작동하기 시작했습니다. 방법이 명확에도 예약 매개 변수를 취할하지 않기로 결정 이유가 거기에 있었다Book
목적은? 유일한 차이점은 동일한 클래스 내에서 인스턴스화되었으며 하나의 데이터 멤버로 채워진 것 같습니다. 매우 혼란 스러워요. 제발 빛 좀 비춰 줘?