2014-12-06 117 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

相关问题