有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图在我的应用程序中为Java类BookChapter实现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方法的正确方法是什么


共 (4) 个答案

  1. # 1 楼答案

    只有当一本书的ISBN相等时,它才能与另一本书相等。因此,仅基于该字段实现book equals

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

  2. # 2 楼答案

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

    当你有一部分关系,比如书和章节,在定义equals()时,部分(章节)有时会考虑整个(书)。但不是相反

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

  3. # 3 楼答案

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

    解决这一具体问题的更好方法不是比较这些书,而是比较它们的ISBN,因为这是一本书的唯一标识符

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

  4. # 4 楼答案

    您必须选择一个Book字段作为ID(如ISBN)。然后,在Chapterequals中,您可以执行以下操作

    book.getISBN().equals(other.book.getISBN())