2011-05-26 42 views
6

我試圖在我的應用程序中爲Java類BookChapter實現equals方法。 Book有一套Chapter s,而Chapter有一個關聯的Book。雙向關聯如下圖所示:equals()方法用於具有雙向關聯的類

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

    } 
} 

現在我試圖執行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; 
     } 
    } 

} 

在這裏,我想知道如果我需要比較的書場爲好。這不會啓動一個無限循環嗎?對這種雙向關聯實施equals方法的正確方法是什麼?

回答

1

(我假設這是Java) 在Chapter class equals方法中,您可以比較書本參考(即使用==,不等於)。這只是比較引用,所以它會避免無限循環。但是,如果您有時克隆書籍,則此方法將失敗。

解決這個特定情況的一種更好的方法是比較不是書籍,而是他們的ISBN,因爲這是書籍的唯一標識符。

一般來說,最好避免像這樣的雙向依賴。一種方法是讓這兩個類中的一個實現一個接口,以免直接使用它。

+1

即使使用接口可以防止類之間的雙向依賴,仍然是在運行時的實例之間的雙向依賴。所以我建議不要把這些書(通過'=='或'equals()')進行比較,但是要麼簡單地忽略這些書(是不同的書中兩個完全相同或不同的書的相同章節),要麼比較一本書標識符如ISBN。 – 2011-05-28 18:09:53

+0

我完全同意,我只是評論了循環依賴,因爲我被教導要儘可能避免它們。 – 2011-05-30 14:48:33

1

從建模的角度來看,本章是本書的一部分。所以儘管你有兩個方向的參考,但這本書比章節「更強」。

當您與Book和Chapter有部分關係時,部分(Chapter)有時會在定義equals()時考慮整個(Book)。但不是相反的。

顯然,本書不會使用它的章節來定義equals()。本章可能會使用這本書。這取決於模型。

4

一本書應該等於另一本書,只要它們的ISBN相等。因此,僅基於該字段實現書籍等同。

對於章 - 比較章節號和所屬Book

1

你必須選擇一個Book字段作爲ID(如ISBN)。然後,在Chapter平等,你可以做的事情一樣

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