【问题标题】:Equals method for objects对象的等于方法
【发布时间】:2010-10-16 19:32:39
【问题描述】:

我正在尝试为对象编写一个 equals 方法来比较它们的字段并在它们相等时返回 true。

private int x, y, direction;
private Color color;

public boolean equals(Ghost other){
   if (this.x == other.x && this.y == other.y &&
       this.direction == other.direction && this.color == other.color)
      return true;
   else 
      return false;
}

这有什么问题?

【问题讨论】:

  • @fprime:你只需要一个return语句,不需要if。 ;-)
  • 在 if 语句之前打印出单个 if 短语(例如 this.x == other.x)的结果。看看哪些失败了。
  • 是否有任何变量被比较对象类型,而不是原始类型?
  • 现在等等,我在做的是比较内存地址还是实际值?
  • 它会比较值,你有没有运行你的代码看看它是否有效?

标签: java object equals


【解决方案1】:

由于color appears to beColor,这是一个类,因此是一个引用类型,这意味着您需要使用equals() 来比较颜色。

if (/* ... && */ this.color.equals(other.color)) {

如 cmets 中所述,使用 == 比较引用类型实际上是比较 Java 中的内存地址。如果它们都引用内存中的同一个对象,它只会返回true


akf points out,您需要使用基类 Object 作为参数,否则您不会覆盖 Object.equals(),而是实际上重载它,即提供调用同名方法的不同方式。如果您碰巧传递了一个完全不同类的对象,则可能会发生意外行为(尽管如果它们属于不同类,它仍然会正确返回 false)。

@Override
public boolean equals(Object obj) {
    if (!(obj instanceof Ghost))
        return false;

    // Cast Object to Ghost so the comparison below will work
    Ghost other = (Ghost) obj;

    return this.x == other.x
        && this.y == other.y
        && this.direction == other.direction
        && this.color.equals(other.color);
}

【讨论】:

  • 嗯,好的。我已经创建了一个 equals 方法,所以我只是在颜色字段上使用它,现在它可以工作了:) 谢谢
【解决方案2】:

原则上,这看起来不错。

但请注意,您使用== 进行比较。对于原语,这没有问题,但对于对象,它将检查相同的实例,而不是相同的值。这可能是也可能不是您想要的。如果您正在比较例如java.lang.Strings,你会想用equals代替(并检查null)。

【讨论】:

    【解决方案3】:

    如果您要比较对象变量而不是原始类型,则应该使用this.color.equals(other.color) 比较。

    在您的情况下,它还取决于您如何创建 Color 对象。如果您使用静态实例(例如 Color.BLUE),那么实际上,它应该没关系。如果您从 rgb 值创建了 Color 对象,那肯定很重要。无论哪种方式,最好习惯使用 .equals() 作为对象变量。

    【讨论】:

      【解决方案4】:

      要考虑的一件事是,您没有从Object 覆盖equals 方法,因为您正在更改参数类型。您可能会发现此方法不会像您预期的那样在所有情况下都使用。而不是:

      public boolean equals(Ghost other){
      

      你应该有:

      public boolean equals(Object other){
      

      然后在内部测试 other 参数是否为 instanceof Ghost 并根据需要进行强制转换。

      【讨论】:

      • +1 不错的收获。我应该修正我的答案吗,因为目前我的答案的第二部分不正确?
      • 是的,添加它以获得更完整的答案。
      猜你喜欢
      • 2021-04-12
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多