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

mar*_*n72 6 java equals bidirectional

我想实现equals的Java类方法Book,并Chapter在我的应用程序.Book有一组Chapters,而a 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;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我试图实现equalsChapter:

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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

在这里,我想知道我是否还需要比较书籍领域.那不会开始无限循环吗?equals为这种双向关联实现该方法的正确方法是什么?

dar*_*mos 1

(我假设这是 Java)在 Chapter 类的 equals 方法中,您可以只比较书籍引用(即使用 ==,而不是 equals)。这仅比较引用,因此可以避免无限循环。但是,如果您有时克隆书籍,这种方法就会失败。

解决这种特定情况的更好方法是不比较书籍,而是比较它们的 ISBN,因为这是一本书的唯一标识符。

一般来说,最好避免这样的双向依赖。一种方法是让两个类之一实现一个接口,以免直接使用它。