实现.equals(Die aDie)方法和静态变量

时间:2012-02-28 15:14:02

标签: java

我正在我的程序中创建方法.equals(Die aDie)。我是否比较每个实例变量,包括静态变量?

7 个答案:

答案 0 :(得分:4)

  

布尔等于(Die aDie)

错误,类会调用equals(Object)方法并忽略你的等号(Die)。还使用等于(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(){
     ...
 }

您可以忽略静态字段,因为它们对于每个Die都是相同的。

答案 1 :(得分:2)

根据定义,静态变量不是实例变量,因此在同一个类的所有实例中始终相等。

答案 2 :(得分:1)

绝对不是静态的。

是否比较 all 实例变量取决于决定对象“身份”的因素,即您认为它们何时相等?这只能在您的特定应用程序的上下文中决定 - 我们需要更多信息。

例如,如果您有一个代表书籍的类,您可能只比较ISBN号以确定两本书是否是同一本书,如果您只想存储有关它们的元数据(标题,作者)。如果合并了两个这样的数据库,则需要消除重复记录。

但是,如果您正在实施实际实体图书的图书馆目录,则每个单独的副本都很重要且不同,因此您可以比较ISBN 副本编号。如果您合并了两个库,那么您希望能够检测到重复的副本。

答案 3 :(得分:0)

您将比较每个实例变量。

静态变量保证相同,因为它们是特定于类的,而不是特定于实例的,因此您不必担心比较它们。

答案 4 :(得分:0)

这没有任何意义,因为使用equals()比较实例,因为它们是静态的:你会将它们与自己进行比较?

答案 5 :(得分:0)

比较静态数据是没用的,因为它在Die类的所有实例之间共享。但您可以通过直接访问它们来比较各个字段(请参阅下面的示例)。请注意,如果您的Die对象包含复杂字段(例如MapSet等的实例),您还应该在这些对象上调用equals方法(同样,见下面的例子。)

如果您想提供equals ()方法,则应覆盖Object类(equals (Object anOtherObject)中提供的方法,而不是超载它,或至少确保您也覆盖equals (Object anOtherObject)以确保它也返回正确的值(默认实现仅检查它是否是相同的实例)。然后,在您的方法中,您应该检查anOtherObjectDie的实例。

以下是一个示例,假设您的Die班级有3个字段:String nameint valueMap<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的非常详细的部分。你一定要读它。

答案 6 :(得分:0)

当使用关键字“static”声明变量时,它称为“类变量”。所有实例共享变量的相同副本(在同一个类的所有实例中始终相等)。可以使用类直接访问类变量,而无需创建实例。