我正在尝试为比较字段的对象编写一个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;
}
这可能有什么问题?
答案 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
是否为必需品。