如何解决具有双向关联的类的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())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。