我在理解这段代码时遇到了一些麻烦。我知道我需要创建一个比较非内置函数的方法,但有人可以向我解释一下布尔equals()
实际上在做什么吗?
public class Book {
private String title;
private Author author;
private int year;
public boolean equals(Object o) {
if (o == this) { return true; }
if (o == null) { return false;}
if (!o.getClass().equals(Book.class)) {return false; }
Book aBook = (Book) o;
return aBook.year == year && aBook.title.equals(title) && aBook.author.equals(author);
}
}
这是朋友给我的,如果你有任何改进建议,请告诉我。
答案 0 :(得分:1)
在您的代码中查看我的评论: -
public boolean equals(Object o) {
//below line is comparing if o refers to the same current object
if (o == this) { return true; }
//below line is checking if o is null, in that case it will return false
if (o == null) { return false;}
//checking if the class of o is Book, if not return false
if (!o.getClass().equals(Book.class)) {return false; }
//Casting the o from Object to Book class
Book aBook = (Book) o;
//comparing the book object's year. title and author, if all three are equal then only two Book objects are equal
return aBook.year == year && aBook.title.equals(title) && aBook.author.equals(author);
}
您将调用以下方法: -
Book object1=new Book();
Book object2=new Book();
object1.equals(object2);
场景1: - 代码中的第一行检查,object1和object2是否引用同一个对象: -
Book object1=new Book();
Book object2=object1;
object1.equals(object2);
上面的情况在你的第一行处理,你可以在方案1中看到,object2基本上是与object1相同的当前对象。
您的null和类条件可以写成: -
if((o == null) || (o.getClass() != this.getClass())) return false; //preferred
不要试图使用: -
if(!(o instanceof Book)) return false; //avoid
因为如果参数是类Book的子类,则上述条件无法返回false。
在equals方法的最后一部分中,您只是比较两个Book对象的三个属性,并且只有当所有三个属性相等时才调用两个对象。