2014-12-06 2 views
0

Итак, в школе мы изучаем Java в первый раз, и мы хотели имитировать приложение Java libray, где у нас есть два класса с именем «Книга» и другое одно имя », и может быть ни одна книга с тем же ISBN в той же полке. Так что я сделал не было, как следующее внутри класса полки и она отлично работает.Когда я должен переопределить метод равенства в Java

private boolean checkIsbnNumber(Book book){ 
     boolean isbnTaken = false; 
     for(Book bList : this.bookList){ 
      if(bList.getIsbn().equals(book.getIsbn())){ 
       System.out.println("The books isbn number is taken"); 
       isbnTaken = true; 
      } 
     } 
     return isbnTaken; 
    } 

Но наш lecturue сказал нам в следующий, перейдите на класс книги и переопределить хеш-метод и равный метод следующим образом:

@Override 
    public boolean equals(Object obj) { 
     if (obj instanceof Book) 
      return isbn.equals(((Book)obj).isbn); 
     else 
      return false; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 3; 
     hash = 53 * hash + Objects.hashCode(this.isbn); 
     return hash; 
    } 

Затем сделайте следующее внутри класса полки еще раз.

public boolean checkISBN(Book b){ 
     boolean isbnExists = false; 
     for (Book bList : bookList) 
     { 
      if(bList.getIsbn().equals(b.getIsbn())){ 
       System.out.println("Book ISBN already exist"); 
       isbnExists = true; 
      } 
     } 
     return isbnExists; 
    } 

Что я хочу знать, в чем смысл этого? есть ли какие-либо выгоды от этого? и почему мы снова вызываем метод equals внутри метода equals? Некоторая помощь будет принята с благодарностью.

+0

Ммм ... Я не вижу разницы.Помимо частного vs public, единственными очевидными изменениями являются имена переменных/методов и выходной текст. (Кстати, вывод текста здесь кажется неправильным.) То, что метод на самом деле * делает *, как оно работает, не изменилось ни на один бит. – cHao

ответ

3

, если вы действительно хотите использовать равно метод, чем ваше сравнение должны быть следующим: -

public boolean checkISBN(Book b){ 
    boolean isbnExists = false; 
    for (Book bList : bookList) 
    { 
     if(**bList.equals(b)**){ 
      System.out.println("Book ISBN already exist"); 
      isbnExists = true; 
     } 
    } 
    return isbnExists; 
} 

Извещение о высокой части изделия.

Ваш лектор хочет сделать это, чтобы сделать более понятным использование метода equals. Позвольте мне объяснить вам разницу между вашим подходом и его соглашением. Тогда преимущество этого: - 1. Без использования равных: - В этом подходе вы сравниваете ISBN книги, и вы не ставите книгу с таким же ISBN на полке.

  1. С равным переопределением: - Во-первых, вы являетесь главными равными, что означает, что вы говорите, что две книги с одинаковым ISBN равны. Шаг второй вы сравниваете, если книги равны.

Итак, в чем преимущество, скажем, вам нужна другая операция, основанная на том же равенстве, что и в вашей программе, тогда вы не сможете писать логику ISBN везде, вам просто нужно написать равные. Преимущество 1: - В реальном мире разные части программного обеспечения написаны разными лицами, поэтому, если вы пишете книгу, другому человеку не нужно знать, что делает две книги одинаковыми. его часть дизайна или требования, будет два кода записи на основе равенства.

Advantage 2: - Tommarrow, вы решаете, что равенство книги основано не только на ISBN no. но и автору, вам нужно только обновить метод equals, и каждый код будет работать нормально, не нужно менять всех.

В реальном мире программирования, объектно-ориентированное кодирование делается для реальных объектов, а иногда объект изменения, связанные с businees channges в реальном мире

+0

Не очень хорошая практика выделить что-то внутри части кода. – Maximin

+0

Хорошо, это дает мне прекрасное объяснение, спасибо за объяснение. – Steve

+0

Maximin благодарит за предложение, однако я выделил как свою часть так же, как и его, только одну строку. И он студент колледжа, я думал, что он может упустить разницу. Я считаю, что он пропустил то же самое, когда его лекатер пропустил то же самое – Panther

2

Что я хочу знать, в чем смысл этого?

Хорошо, ваше состояние в том, что никакие два ISBN не могут быть одинаковыми. Вы меняете свой метод equals так, чтобы он считал два объекта Book равными, если ISBN одинаковый.

и почему мы снова вызываем метод equals внутри метода equals?

Ваш ISBN является Object. Когда вы сравниваете два объекта, если вы сделаете это так ..

Object1 == Object2 

Затем вы проверяете, если они тот же объект. Нет, если они имеют одинаковое значение . Когда вы вызываете equals, вы тестируете другое условие. Например, в случае String ..

String s = new String("Hello"); 
String s2 = new String("Hello"); 

s == s2; // Returns false. 
s.equals(s2); // Returns true. 

Это потому, что s не является тем же объектом, как s2, но оно имеет то же значение.

Дополнительное чтение

  • Here это действительно глубокий анализ почему вам нужно переопределить метод hashCode.

  • Here - это подробная информация о том, почему вам нужно использовать equals с объектами, а не ==.

+0

Я действительно получаю == часть, вещь, я не понимаю, почему я должен переопределять равные. – Steve

+0

Почему? Потому что это конвенция! – christopher

1

В общем, вы переопределить equals() по двум причинам:

  • Вы хотите иметь пользовательские semantcs равенства для объекта, или
  • Вы хотите использовать объект в хэш-контейнере.

В обоих случаях вы должны переопределить hashCode.

Например, если вы хотите прикрепить комментарии к каждой книге, не изменяя саму книгу объект, имеющий собственно equals и hashCode позволит вам сделать это:

Map<Book,String> comments = new HashMap<Book,String>(); 
comments.put(myBook, "This is a good book"); 

Хотя вы можете определить равенство книжных объектов, проверяя их ISBN за пределами класса, лучше иметь эту функциональность внутри класса, так как люди, которые не знают ваш конкретный класс, смогут понять, что происходит, когда они видят equals. Они также будут иметь возможность использовать класс без изучения его в глубине, потому что пишут это

if (book1.equals(book2)) ... 

проще, чем писать этот

if (book1.getIsbn().equals(book2.getIsbn())) ... 
+0

Простая часть, которую я понимаю, хорошо, поэтому лектор должен изменить код на это, а? – Steve

+0

@Colosuslol Правильно, когда вы «равны» реализованы так, как вы делаете, ваш 'checkISBN' может переключиться на использование кода' if (book1.equals (book2)) '. – dasblinkenlight

Смежные вопросы