具有双向关联的类的equals方法

问题描述

| 我试图在我的应用程序中为java类
Book
Chapter
实现
equals
方法
Book
具有一组
Chapter
,而a2ѭ具有关联的
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;
        }
    }

}
在这里,我想知道是否也需要比较书本领域。那不会开始无限循环吗?实现此类双向关联的“ 0”方法的正确方法是什么?     

解决方法

仅当一本书的ISBN相等时,它才应与另一本书相等。因此,仅根据该领域实现本书等同。 对于章节-比较章节编号和所属的
Book
    ,(我假设这是Java) 在Chapter类equals方法中,您可以只比较书籍参考(即,使用==,而不是equals)。这仅比较引用,因此可以避免无限循环。但是,如果您有时克隆书籍,则此方法将失败。 解决此特定情况的更好方法是不比较书籍,而是比较书籍的ISBN,因为这是书籍的唯一标识符。 通常,最好避免这样的双向依赖性。一种方法是让两个类之一实现一个接口,以免直接使用它。     ,从建模的角度来看,本章是本书的一部分。因此,尽管您在两个方向上都有参考,但该书比本章“强”。 当您具有Book和Chapter之类的部分关系时,在定义equals()时,部分(Chapter)有时会考虑整个(Book)。但并非相反。 很明显,这本书不会使用其章节来定义equals()。本章可能会使用这本书。这取决于模型。     ,您必须选择一个“ 1”字段作为ID(例如ISBN)。然后,在
Chapter
等于中,您可以做类似
book.getISBN().equals(other.book.getISBN())