8

我正在尝试在我的应用程序中实现equalsJava 类的方法Book。有一组s,而 a有一个关联的。双向关联如下图所示:ChapterBookChapterChapterBook

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

    }
}

现在我尝试equals实现Chapter

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

}

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

4

4 回答 4

4

只有当它们的 ISBN 相同时,一本书才应该等于另一本书。因此,仅基于该字段实施 book equals。

对于章节 - 比较章节编号和拥有Book

于 2011-05-28T18:58:04.547 回答
1

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

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

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

于 2011-05-26T18:54:18.120 回答
1

您必须选择一个Book字段作为 ID(如 ISBN)。然后,在Chapterequals中,你可以做类似的事情

book.getISBN().equals(other.book.getISBN())
于 2011-05-28T19:00:36.740 回答
1

从建模的角度来看,这一章是本书的一部分。因此,尽管您在两个方向都有参考,但本书比章节“更强大”。

当您与 Book 和 Chapter 有部分关系时,在定义 equals() 时,部分(Chapter)有时会考虑整个(Book)。但不是反过来。

很明显,这本书不会使用它的章节来定义 equals()。本章可能会使用本书。这取决于型号。

于 2011-05-28T18:49:48.923 回答