Apache Commons Lang提供一套生成hashCode()、equals()和compareTo()的API,簡單易用.這個與toString()工具用法類似.
一、實現策略
1、hashCode()
通過HashCodeBuilder反射來生成,這說明類的hashCode與類中所有的域都相關.
也可以通過HashCodeBuilder實例來制定生成.
2、equals()
也有兩種生成方式,與toString()、hashCode()的生成策略類似.
3、compareTo()
與以上都類似.
二、實例
為了測試,創佳兩個類 Foo、Bar,參看上篇文章,分別通過兩種方式實現其hashCode()和equals()方法
public class Foo { private String name; private int age; private Bar bar; public Foo(String name, int age) { this.name = name; this.age = age; } //省略getter/setter方法 } |
public class Bar { private String name; public Bar(String name) { this.name = name; } //省略getter/setter方法 } |
1、實現hashCode()
反射方式
@Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } |
制定方式
@Override public int hashCode() { return new HashCodeBuilder(17, 37) .append(name) .append(age) .append(bar) .toHashCode(); } |
2、實現equals()
反射方式
@Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } |
制定方式
@Override public boolean equals(Object obj) { boolean flag = false; if (obj != null && Foo.class.isAssignableFrom(obj.getClass())) { Foo f = (Foo) obj; flag = new EqualsBuilder() .append(name, f.getName()) .append(age, f.getAge()) .append(bar, f.getBar()).isEquals(); } return flag; } |
3、生成compareTo()
當然,實現compareTo()的前提是Foo類實現了Comparable介面.否則沒啥意義.
反射實現
public int compareTo(Object obj) { return CompareToBuilder.reflectionCompare(this, obj); } |
制定實現
public int compareTo(Object obj) { int flag = -1; if (obj != null && Foo.class.isAssignableFrom(obj.getClass())) { Foo f = (Foo) obj; flag = new CompareToBuilder() .append(name, getName()) .append(age, f.getAge()) .append(bar, f.getBar()) .toComparison(); } return flag; } |
EqualsBuilder不光可以比較對象,還可以通過其對象來比較各種類型的數據.包括數組.
[火星人 ] Apache Commons Lang之hashCode()、equals()和compareTo()已經有645次圍觀