Apache Commons Lang提供一套生成hashCode()equals()和compareTo()的API简单易用这个与toString()工具用法类似
一实现策略
hashCode()
通过HashCodeBuilder反射来生成这说明类的hashCode与类中所有的域都相关
也可以通过HashCodeBuilder实例来制定生成
equals()
也有两种生成方式与toString()hashCode()的生成策略类似
compareTo()
与以上都类似
二实例
为了测试创佳两个类 FooBar参看上篇文章分别通过两种方式实现其hashCode()和equals()方法
public class Foo {
private String name;
private int age;
private Bar bar;
public Foo(String name int age) {
thisname = name;
thisage = age;
}
//省略getter/setter方法
}
public class Bar {
private String name;
public Bar(String name) {
thisname = name;
}
//省略getter/setter方法
}
实现hashCode()
反射方式
@Override
public int hashCode() {
return HashCodeBuilderreflectionHashCode(this);
}
制定方式
@Override
public int hashCode() {
return new HashCodeBuilder( )
append(name)
append(age)
append(bar)
toHashCode();
}
实现equals()
反射方式
@Override
public boolean equals(Object obj) {
return EqualsBuilderreflectionEquals(this obj);
}
制定方式
@Override
public boolean equals(Object obj) {
boolean flag = false;
if (obj != null && FooclassisAssignableFrom(objgetClass())) {
Foo f = (Foo) obj;
flag = new EqualsBuilder()
append(name fgetName())
append(age fgetAge())
append(bar fgetBar())isEquals();
}
return flag;
}
生成compareTo()
当然实现compareTo()的前提是Foo类实现了Comparable接口否则没啥意义
反射实现
public int compareTo(Object obj) {
return CompareToBuilderreflectionCompare(this obj);
}
制定实现
public int compareTo(Object obj) {
int flag = ;
if (obj != null && FooclassisAssignableFrom(objgetClass())) {
Foo f = (Foo) obj;
flag = new CompareToBuilder()
append(name getName())
append(age fgetAge())
append(bar fgetBar())
toComparison();
}
return flag;
}
EqualsBuilder不光可以比较对象还可以通过其对象来比较各种类型的数据包括数组