歡迎您光臨本站 註冊首頁

Apache Commons Lang之hashCode()、equals()和compareTo()

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

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次圍觀

http://coctec.com/docs/java/show-post-61744.html