2010-10-16 59 views
3

我想写的equals方法的对象比较他们的田地,如果相等,则真正的方法:的Equals的对象

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; 
} 

会是什么问题呢?

+1

@fprime:你只需要一个return语句,而不需要'if'。 ;-) – 2010-10-16 19:33:29

+1

打印出个人的结果,如果短语(例如'this.x == other。在if语句之前。看哪一个失败。 – 2010-10-16 19:34:58

+0

被比较的任何变量对象类型,而不是原始类型? – 2010-10-16 19:35:03

回答

7

我看着one of your previous questions,它似乎color字段是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); 
} 
+0

啊,没问题。我已经创建了一个equals方法,所以我只是用它在颜色领域,现在它的工作:)谢谢 – Snowman 2010-10-16 19:38:50

4

原则上,这看起来很好。

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

3

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

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

3

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

public boolean equals(Ghost other){ 

你应该有:

public boolean equals(Object other){ 

,然后在内部测试other PARAM是否为instanceofGhost和塑像作为necessry。

+0

+1尼斯赶上那里。我是否应该修复我的答案,因为就其本身而言,我的答案的第二部分是不正确的? – BoltClock 2010-10-16 19:53:01

+0

是的,加一个更完整的答案。 – akf 2010-10-16 19:56:14