等于对象的方法

时间:2010-10-16 19:32:39

标签: java object equals

我正在尝试为比较字段的对象编写一个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;
}

这可能有什么问题?

4 个答案:

答案 0 :(得分:7)

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

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

如评论中所述,使用==来比较引用类型实际上是在比较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);
}

答案 1 :(得分:4)

原则上,这看起来很好。

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

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

public boolean equals(Ghost other){

你应该:

public boolean equals(Object other){

然后在内部测试other param是instanceof Ghost是否为必需品。