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

3

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

7个回答

4

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(){
     ...
 }

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

2

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


1

绝对不是静态的。

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

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

但是,如果您正在实现实际物理书籍的图书馆目录,则每个单独的副本都很重要且不同,因此您可能会比较ISBN和副本编号。如果您合并了两个图书馆,您将期望能够检测到重复副本。


0

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

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

以下是一个示例,假设您的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方法。你一定要读一读。


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

0
你需要比较每个实例变量。
静态变量是保证相等的,因为它们是类特定的,而不是实例特定的,所以你不必担心比较它们。

仅限实例变量。如果 Die.sides 是静态的,比较 Die a.sidesDie b.sides 永远不可能 为假。静态变量在值和内存位置上是相同的。 - Sam DeHaan

0

这是没有意义的,因为使用equals()方法你比较的是实例 它们是静态的,那你可以拿它们自己来做比较吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接