我想在Java中创建一个名为 Foo 的新类,它有2个成员变量, int bar 和 double temp ,我想给该类一个equals方法,它比较类的2个实例并返回一个布尔值。我有2个Foo,f1和f2的实例。假设构造函数已正确定义,很多人会告诉我这样做:
public boolean equals(Foo f2)
{
return (bar == f2.getBar() &&
temp == f2.getTemp());
}
在哪里检查是否相等,你会做
f1.equals(f2);
但是,我很确定我已经看到有些人这样做了:
public static boolean equals(Foo f1, Foo f2)
{
return (f1.getBar() == f2.getBar() &&
f1.getTemp() == f2.getTemp());
}
在哪里检查是否相等,你会做
Foo.equals(f1, f2);
我的问题是,既然我已经看过这两种实现,那么哪两种被认为是更好的编程风格?
答案 0 :(得分:2)
像HashMap
这样的标准Java类需要像
public boolean equals(Object obj)
// ^^^^^^
不
public boolean equals(Foo f2)
这意味着它将使用从您的超类继承的equals(Object obj)
(因此,如果超类是Object,它将最终在内部使用==
。
因此,这两种方法都只是其他方法,可能同样好或同样不好,具体取决于您希望如何使用它们。 IMO equals(Foo f2)
略差,因为它会导致与equals(Object o)
混淆。
答案 1 :(得分:0)
这两个代码段代表不同的实现,将用于不同的目的。
public boolean equals(Foo f2)
{
return (bar == f2.getBar() &&
temp == f2.getTemp());
}
该代码段将在Foo
类中实施,并在其中检查另一个Foo
。
在哪里
public static boolean equals(Foo f1, Foo f2)
{
return (f1.getBar() == f2.getBar() &&
f1.getTemp() == f2.getTemp());
}
是您传递的工具,两个Foo's
用于检查equality
。
答案 2 :(得分:0)
你最好使用非静态版本,因为这会覆盖Object.equals方法,java会在你不知道的时候调用它,例如当你的Foo对象在一个集合中时,你调用myList 。载(myfooInstance)。如果只实现静态版本,当java需要知道两个Foo对象是否相等时,它将不会被调用。但是正如Phesmo所说,你需要使用'Object'参数而不是'Foo'参数。