对象的 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;
}
这可能有什么问题吗?
I'm trying to write an equals method for objects that compares their fields and return true if they're equal.
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;
}
What could be wrong with this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
由于
color
似乎是Color
,这是一个类,因此是一个引用type,这意味着您需要使用equals()
来比较颜色。正如注释中所指出的,使用
==
来比较引用类型实际上是在 Java 中比较内存地址。仅当它们都引用内存中的同一对象时,它才会返回true
。akf 指出您需要使用基本
对象 类作为参数,否则您不会覆盖
Object.equals()
,而是实际重载它,即提供调用同名方法的不同方式。如果您碰巧偶然传递了完全不同类的对象,则可能会发生意外行为(尽管如果它们属于不同类,无论如何它都会正确返回false
)。Since
color
appears to be aColor
, that's a class, and therefore a reference type, which means you need to useequals()
to compare the colors.As noted in the comments, using
==
to compare reference types is really comparing memory addresses in Java. It'll only returntrue
if they both refer to the same object in memory.akf points out that you need to use the base
Object
class for your parameter, otherwise you're not overridingObject.equals()
, but actually overloading it, i.e. providing a different way of calling the same-named method. If you happen to pass an object of a totally different class by accident, unexpected behavior might occur (although then again if they are of different classes it will returnfalse
correctly anyway).原则上,这看起来不错。
但请注意,您正在使用
==
进行比较。对于基元来说,这没有问题,但对于对象来说,它将检查相同的实例,而不是相同的值。这可能是也可能不是您想要的。如果您要比较例如 java.lang.Strings,则需要使用equals
(并检查null
)。In principle, this looks fine.
Note however that you are comparing using
==
. For primitives, this is no problem, but for objects it will check for the same instance, not the same value. This may or may not be what you want. If you are comparing e.g. java.lang.Strings, you'd want to useequals
instead (and check fornull
).如果您要比较对象变量而不是基本类型,则应该使用
this.color.equals(other.color)
比较。就您而言,这还取决于您创建 Color 对象的方式。如果您使用静态实例(例如 Color.BLUE),那么实际上,这应该不重要。如果您从 RGB 值创建 Color 对象,那么它绝对很重要。无论哪种方式,最好习惯使用 .equals() 作为对象变量。
If you are comparing object variables instead of primitive types, you should be using a
this.color.equals(other.color)
comparison instead.In your case, it also depends on how you created the Color objects. if you used the static instances (such as Color.BLUE), then actually, it shouldn't matter. If you created the Color object from rgb values, it definitely matters. Either way, it is best to get used to using .equals() for object variables.
需要考虑的一件事是,当您更改参数类型时,您不会覆盖
Object
中的equals
方法。您可能会发现此方法不会像您预期的那样在所有情况下都使用。而不是:你应该:
然后在内部测试
other
参数是否是instanceof
Ghost
并根据需要进行强制转换。One thing to consider is that you are not overriding the
equals
method fromObject
, as you are changing the param type. You might find this method will not be used in all cases as you might expect. Instead of:you should have:
and then internally test whether the
other
param is aninstanceof
Ghost
and cast as necessry.