具有双向关联的类的java equals()方法
我试图在我的应用程序中为Java类Book
和Chapter
实现equals
方法Book
有一组Chapter
,而Chapter
有一个关联的Book
。双向关联如下图所示:
class Book{
private String isbn;
private String name;
private Date publishDate;
private Set<Chapter> chapters;
...
public boolean equals(Object o){
if(o == this){
return true;
}
if (!(o instanceof Book)){
return false;
}
Book book = (Book)o;
if( (this.isbn.equals(book.getIsbn()) ) && (this.name.equals(book.getName())) &&(this.publishDate.equals(book.getPublishDate())) &&(this.chapters.equals(book.getChapters())) ){
return true;
}else{
return false;
}
}
}
现在我尝试为Chapter
实现equals
:
public class Chapter {
private String title;
private Integer noOfPages;
private Book book;
...
public boolean equals(Object o){
if(o == this){
return true;
}
if (!(o instanceof Chapter)){
return false;
}
Chapter ch = (Chapter)o;
if((this.title.equals(book.getTitle())) && (this.noOfPages.intValue()== book.getNoOfPages().intValue()) ){
return true;
}else{
return false;
}
}
}
在这里,我想知道我是否也需要比较book字段。这不是开始了一个无限循环吗?为这种双向关联实现equals
方法的正确方法是什么
# 1 楼答案
只有当一本书的ISBN相等时,它才能与另一本书相等。因此,仅基于该字段实现book equals
对于章节-比较章节号和拥有者
Book
# 2 楼答案
从建模的角度来看,本章是本书的一部分。因此,尽管你在两个方向都有参考文献,但这本书比这一章更“有力”
当你有一部分关系,比如书和章节,在定义equals()时,部分(章节)有时会考虑整个(书)。但不是相反
很明显,这本书不会用它的章节来定义equals()。本章可能会用到这本书。这取决于模型
# 3 楼答案
(我假设这是Java) 在Chapter class equals方法中,您可以只比较书籍引用(即使用==,而不是equals)。这只会比较引用,因此可以避免无限循环。然而,如果你有时克隆书籍,这种方法就会失败
解决这一具体问题的更好方法不是比较这些书,而是比较它们的ISBN,因为这是一本书的唯一标识符
一般来说,最好避免这样的双向依赖关系。一种方法是让两个类中的一个实现接口,这样就不会直接使用它
# 4 楼答案
您必须选择一个
Book
字段作为ID(如ISBN)。然后,在Chapter
equals中,您可以执行以下操作