Java equals() for Objects (Super&Subclasses)



大家好,我只是一个学习抽象类的初学者& &;接口。

我们通过创建克隆和比较对象来构建我们的盈利测试。
我已经学习了覆盖equals()方法的详细方法…

@Override 
public boolean equals(Object obj){
if (this == obj){
return true;
}
else if (obj == null){
return false;
}
...
else {
Obj x = (*Superclass*)obj;
… 
}

我现在想知道我是否可以通过一个简短的版本来取代这条漫长的道路,我改变了toString方法,做了toString方法的hashCode,并比较了我的对象的hashCode(原始&克隆)。

这是可以做的还是有任何理由我不应该这样做?如果我们假设子类使用相同的变量,我是否能够继承toString, hashCode和equals方法并在子类中调整clone() ?

我的想法是以下

public abstract *Superclass*{ 
public String name;  //would be private in org. code 
public int hp;  //would be private in org. code 
public Superclass(){
}

@Override
public Superclass clone(){
return this;  //(not sure if this is ok to use)
}

@Override 
public String toString(){
Class temp = getClass();
return temp.getName() + this.name + " " + this.hp;
}
@Override
public int hashCode(){
int hcModify = 10;
int hcCurrent = this.toString().hashCode();
return hcModify * hcCurrent; 
}

@Override 
public boolean equals(Object obj){
return this.hashCode() == obj.hashCode())
}

}

所以首先要注意的是,如果obj为null,您的equals方法将抛出错误-您不能在null上使用任何.操作符。

你的clone方法是危险的,如果有可变性,可变性意味着"值可以被改变"。因为它只返回一个引用,所以更改将反映在原始和"克隆"中。值(因为它们是相同的)。这不是大多数开发人员所期望的。(我建议查找深克隆和浅克隆,这是相关的。)

x = new Thing()
y = thing.clone()
x.changeInSomeWay()
//is y now also changed?

使用哈希码实现相等不一定是好是坏——它取决于对象与其哈希函数和toString函数的关系,以及是否存在冲突。一些对象将有hashtoString冲突,其中不同的对象将具有相同的哈希或字符串表示-特别是大型或复杂的对象,这些表示不包括您希望在相等性检查中反映的所有数据。

你的就是一个例子。您正在使用int哈希码,它只有2^32(或其他)可能的值,而字符串原则上有无限可能的值;根据鸽子洞原则,因此必须有多个对象具有不同的名称但具有相同的哈希码。

一般来说,这不是一个安全的做法,并且可能导致奇怪的,难以诊断的错误。

我不知道你为什么要乘以10?

最新更新