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

时间:2011-05-26 18:34:47

标签: java equals bidirectional

我正在尝试在我的应用程序中为Java类equalsBook实现Chapter方法。 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;
        }

    }
}

现在我尝试为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 个答案:

答案 0 :(得分:4)

只有当他们的ISBN相等时,一本书应该与另一本书相同。因此,仅基于该字段实现本书等于。

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

答案 1 :(得分:1)

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

解决这一特定案例的更好方法是不比较书籍,而是比较书籍,因为这是书籍的唯一标识符。

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

答案 2 :(得分:1)

从建模角度来看,本章是本书的一部分。因此,虽然你有两个方向的参考,但这本书比章节“更强”。

当您拥有与Book和Chapter类似的部分关系时,部分(章节)有时会在定义equals()时考虑整个(Book)。但不是相反。

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

答案 3 :(得分:1)

您必须选择Book字段作为ID(如ISBN)。然后,在Chapter等于,您可以执行类似

的操作
book.getISBN().equals(other.book.getISBN())