8

equalsJava クラスBookとアプリケーションにメソッドを実装しようとChapterしています。Bookには のセットがありChapterChapterには関連する があり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

4 に答える 4

4

本は、ISBN が等しい場合にのみ、別の本と同等であるべきです。そのため、そのフィールドのみに基づいて book equals を実装します。

章について - 章番号と所有者を比較するBook

于 2011-05-28T18:58:04.547 に答える
1

モデリングの観点からは、この章は本の一部です。したがって、両方の方向に参照がありますが、本は章よりも「強力」です.

Book と Chapter のように part-of の関係がある場合、equals() を定義するときに part (Chapter) が全体 (Book) を考慮に入れることがあります。しかし、その逆ではありません。

明らかに、この本はその章を使用して equals() を定義しません。章は本を使用するかもしれません。それはモデルによって異なります。

于 2011-05-28T18:49:48.923 に答える
1

Bookフィールドを ID (ISBN など) として選択する必要があります。次に、Chapter等しい場合、次のようなことができます

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

(これは Java だと思います) Chapter クラスの equals メソッドでは、書籍の参照を比較するだけです (つまり、equals ではなく == を使用します)。これは参照のみを比較するため、無限ループを回避できます。ただし、時々本を複製すると、このアプローチは失敗します。

この特定のケースを解決するためのさらに良い方法は、本ではなく ISBN を比較することです。ISBN は本を一意に識別するためです。

一般に、このような双方向の依存関係は避けたほうがよいでしょう。1 つの方法は、直接使用しないように、2 つのクラスのいずれかにインターフェイスを実装させることです。

于 2011-05-26T18:54:18.120 に答える