2015-10-09 35 views
0

说,我想创建一个名为在Java中新的类,它有2个成员变量,INT酒吧双温,我想给这个类的equals方法是比较该类的两个实例并返回一个布尔值。我有两个Foo实例,f1和f2。假设是正确定义构造函数中,很多人会告诉我这样做:实现良好的equals方法

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

我的问题是,既然我看到两种实现,哪一种被认为是更好的编程风格?

+1

这不是一个很好的问题,因为它在征求意见。如果两者都起作用,那么它们都不是“更好”,但Java朗语惯例显然是第一个。重要的是你满足[合同](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object))。 – ChiefTwoPencils

回答

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

标准的Java类,如HashMap期待像

public boolean equals(Object obj) 
//     ^^^^^^ 

方法不

public boolean equals(Foo f2) 

这意味着它将使用equals(Object obj)从超类继承(所以如果超类对象时,它会最终使用==内部)。

因此,这两种方法都是简单的附加方法,根据您的使用方式,这些方法可能同样好或同样不好。 IMO equals(Foo f2)稍差,因为它会导致与equals(Object o)混淆。

0

你最好使用非静态版本,因为它覆盖了Object.equals方法,在你不知道的时候java会调用它,比如当你的Foo对象在一个集合中时, myList.contains(myfooInstance)。如果你只实现了静态版本,当java需要知道两个Foo对象是否相等时,它不会被调用。但正如Phesmo所述,您需要使用'Object'参数而不是'Foo'参数。