Метод equals () для классов с двунаправленной ассоциацией - PullRequest
6 голосов
/ 26 мая 2011

Я пытаюсь реализовать метод equals для классов Java Book и 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 ]

4 голосов
/ 28 мая 2011

Книга должна быть равна другой книге, только если их ISBN равны.Поэтому реализуйте книгу равными только на основе этого поля.

Для главы - сравните номер главы и владеющий Book

1 голос
/ 28 мая 2011

Вы должны выбрать поле Book в качестве идентификатора (например, ISBN).Затем, в Chapter равно, вы можете сделать что-то вроде

book.getISBN().equals(other.book.getISBN())
1 голос
/ 28 мая 2011

С точки зрения моделирования, глава является частью книги.Так что, хотя у вас есть ссылки в обоих направлениях, книга «сильнее» главы.

Когда у вас есть часть отношений, как с Книгой и Главой, часть (Глава) иногда занимает целое (Книгу)при определении равно ().Но не наоборот.

Очевидно, что книга не будет использовать свои главы для определения equals ().Глава может использовать книгу.Это зависит от модели.

1 голос
/ 26 мая 2011

(я предполагаю, что это Java) В методе класса equals главы вы можете просто сравнить ссылки на книги (то есть, используя ==, а не equals). Это только сравнение ссылок, так что это позволит избежать бесконечного цикла. Однако, если вы иногда клонируете книги, такой подход потерпит неудачу.

Еще лучшим способом решения этого конкретного случая было бы сравнение не книг, а их ISBN, поскольку это уникальный идентификатор для Книги.

В общем, лучше избегать двунаправленных зависимостей, подобных этой. Один из способов состоит в том, чтобы один из двух классов реализовывал интерфейс, чтобы не использовать его напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...