2014-12-06 76 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告訴我們如下,走在book class並重寫散列和equals方法如下:

@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

嗯...我沒有看到區別對象。除了私有和公共之外,唯一明顯的變化是變量/方法名稱和輸出文本。 (順便說一下,在這裏輸出文本看起來是錯誤的。)實際上,*方法究竟是怎樣工作的,並沒有改變一點。 – cHao 2014-12-06 17:52:39

回答

3

,如果你真的想用更簡單的equals方法比你的比較應該像這樣: -

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. With equals overriding: - 首先,您將覆蓋equals,這意味着您所說的兩本ISBN相同。第二步,比較書籍是否平等。

那麼有什麼好處,比方說你需要在你的程序中基於相同的平等的其他操作,那麼你不會到處編寫ISBN邏輯,你只需要寫等於。 優勢1: - 在現實世界中,軟件的不同部分是由不同的人編寫的,所以如果你正在寫書,其他人就不需要知道什麼使兩本書平等。他的設計或要求的一部分,將是基於平等的兩個編寫代碼。

優勢2: - Tommarrow,你決定平等的書不僅是基於國際標準書號沒有。而且作者,你只需要更新equals方法,每個人的代碼都可以正常工作,不需要改變每個人。

在實際編程世界,面向編碼做了真正的對象和對象有時由於businees channges變化在現實世界中

+0

在代碼部分中突出顯示某些內容不是一種好的做法。 – Maximin 2014-12-06 18:02:38

+0

好的,這使得我完美的推理謝謝你的解釋。 – Steve 2014-12-06 18:05:04

+0

Maximin感謝您的建議,但是我強調我的作品與他的作品一樣,只有一行。他是大學生,我認爲他可能會錯過這個區別。我相信當他的回報員錯過時他也錯過了 – Panther 2014-12-06 18:06:08

2

我想知道的是什麼,是做這件事的意義呢?

那麼你的條件是沒有兩個ISBN可以是相同的。如果ISBN相同,您將更改equals方法,以便它將考慮兩個Book對象相等。

爲什麼我們再次調用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是一個SO詳細說明了爲什麼你需要使用equals與對象而不是==

+0

我確實得到了==部分,我不理解的東西是爲什麼我應該重寫equals。 – Steve 2014-12-06 17:54:44

+0

爲什麼?因爲那是公約! – christopher 2014-12-07 12:42:06

1

在一般情況下,您覆蓋equals()的原因有兩個:

  • 你想有一個自定義平等semantcs爲對象,或
  • 你想用你的對象在哈希容器。

在這兩種情況下,您也必須重寫hashCode

例如,如果你想評論附加到每本書不修改這本書的對象本身具有適度的equalshashCode會讓你這樣做:

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

更容易的部分之一,我明白好,所以lecturere必須改變代碼,以及也是正確的? – Steve 2014-12-06 17:57:38

+0

@Colosuslol正確的是,一旦你擁有「平等」的實現方式,你的'checkISBN'就可以切換到使用'if(book1.equals(book2))'代碼。 – dasblinkenlight 2014-12-06 18:03:33

相關問題