我正在创建程序中的方法.equals(Die aDie)。 我需要比较每个实例变量,包括静态变量吗?
boolean equals(Die aDie)
这是错误的,类将调用equals(Object)
方法并忽略您的equals(Die)
。同时,还应该使用与equals(Object)
相同的字段实现int hashCode()
方法。
@Override public boolean equals(Object aDie){
if(aDie == null || aDie.getClass() != Die.class)return false;
if(aDie == this)return true;
Die other = (Die)aDie;
...
}
@Override public int hashCode(){
...
}
静态变量按定义不是实例变量,因此在同一类的所有实例中始终相等。
绝对不是静态的。
是否比较所有实例变量取决于什么决定了您对象的“身份”,即何时认为它们相等?这只能在您特定应用程序的上下文中决定 - 我们需要更多信息。
例如,如果您有一个表示书籍的类,您可能只比较ISBN号码以确定两本书是否为同一本书,如果您只想存储有关它们的元数据(标题,作者)。如果您合并了两个这样的数据库,您将希望消除重复记录。
但是,如果您正在实现实际物理书籍的图书馆目录,则每个单独的副本都很重要且不同,因此您可能会比较ISBN和副本编号。如果您合并了两个图书馆,您将期望能够检测到重复副本。
比较静态数据是无用的,因为它在您的Die
类的所有实例之间共享。但是,您可以通过直接访问它们来比较各个字段(请参见下面的示例)。请注意,如果您的Die
对象具有复杂字段(例如Map
、Set
等的实例),您还应该在这些对象上调用equals
方法(再次,请参见下面的示例)。
如果您想提供一个equals()
方法,您应该覆盖Object
类中提供的方法(equals(Object anOtherObject)
),而不是重载它,或者至少确保您也覆盖equals(Object anOtherObject)
以确保它也返回正确的值(默认实现仅检查它是否为同一实例)。然后在您的方法中,您应该检查anOtherObject
是否是Die
的实例。
以下是一个示例,假设您的Die
类有3个字段:String name
、int value
和Map<Integer> complexField
:
public boolean equals (Object anOtherObject) {
if (anOtherObject == this) {
return true;
}
if (!anOtherObject instanceof Die) {
return false;
}
Die otherDie = (Die) anOtherObject;
if (this.value != otherDie.value ||
!this.name.equals (otherDie.name) ||
!this.complexField.equals (otherDie.complexField)) {
return false;
}
return true;
}
Josh Bloch的《Effective Java》一书中有非常详细的章节介绍如何正确实现equals
方法。你一定要读一读。
这是没有意义的,因为使用equals()方法你比较的是实例 和 它们是静态的,那你可以拿它们自己来做比较吗?
Die.sides
是静态的,比较Die a.sides
和Die b.sides
永远不可能 为假。静态变量在值和内存位置上是相同的。 - Sam DeHaan