实施良好的平等方法

时间:2015-10-09 18:01:51

标签: java coding-style

我想在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);

我的问题是,既然我已经看过这两种实现,那么哪两种被认为是更好的编程风格?

3 个答案:

答案 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'参数。