当对象o为null时,无法在equals()方法中返回false.我已经添加了我的equals()实现以及测试用例



My equals((方法:例如,当我的对象为null时,在第二个if语句中,我应该返回false,但由于某种原因,我的代码未能返回。有什么帮助吗?

public boolean equals(Prof o) {
boolean res = false;

if(this == o) {
res = true;
}
if(o == null || this.getClass() != o.getClass()) {
res = false; 
}
Prof other = (Prof) o;
if(this.year == other.year) { 
if(this.id.equals(other.id)) {
res = true; 
}
}
else {
res = false;
}
return res;   
}

测试用例:

public void test02_ProfEqualHash() {
Prof  p1 = new Prof("John S Lee", "yu213", 5);

assertTrue(p1.equals(p1));

Prof p0 = null; // null
assertFalse(p1.equals(p0));  // my equals() implementation fails here 

Date d = new Date();
String s = "Hello";
assertFalse(p1.equals(d)); 
assertFalse(p1.equals(s));  


Prof  p2 = new Prof("John L", "yu213", 5);  
assertTrue(p1.equals(p2));

assertTrue(p1.hashCode() == p2.hashCode());

assertTrue(p2.equals(p1)); 

Prof  p3 = new Prof("John S Lee", "yu203", 5); 
assertFalse(p1.equals(p3));

//assertNotEquals(p1.hashCode(), p3.hashCode());  

Prof  p4 = new Prof("Tracy T", "yu053", 2);
assertFalse(p1.equals(p4));
//assertNotEquals(p1.hashCode(), p4.hashCode()); 

Prof  p5 = new Prof("John S Lee", "yu213", 8); 
assertFalse(p1.equals(p5));
//assertTrue(p1.hashCode() != p5.hashCode());

}

首先,为了正确覆盖Objectequals(),方法签名应该是:

public boolean equals(Object o) {
....
}

即使您的测试代码调用了equals()方法,但需要Objectequals()签名的JDK类也不会。

此外,当发现o参数是null时,应该立即返回false,以免以后在方法中访问它(这会导致NullPointerException(。

一个正确的实现可以是这样的:

public boolean equals (Object o) 
{
if (this == o) {
return true;
}
if (o == null || !(o instanceof Prof)) {
return false; 
}
Prof other = (Prof) o;
return this.year == other.year && this.id.equals(other.id);
}

在Java中,Object类是每个类的超类。因此,为了覆盖Object类中定义的equal方法,您需要遵循相同的方法定义,即:

@Override
public boolean equals(Object other) {
// here goes your implementation class
}

由于equals的定义将Prof作为参数,因此实际上并没有覆盖Objectequals方法。

有关equals合同的更多信息,您可以阅读Josh BlochEffective Java书中的Item10

此外,如果您的类有一个equals方法,那么您也应该始终定义hashCode实现。以下是这种方法的实现:

@Override
public int hashCode() {
return Objects.hash(year, id);
}

相关内容

  • 没有找到相关文章

最新更新