两个类都是在
import org.apache.commons.lang3.builder
包下,可以帮助我们很好的重写equals与hashCode方法。
先写个简单的实体类:
package kevin.bean;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Student {
private String name;
private Integer age;
public Student() {
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
//省略get/set方法
@Override
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
使用EqualsBuilder的静态方法reflectionEquals,当且仅当两个对象的值都一一对应相等的时候,返回true。
使用EqualsBuilder的静态方法reflectionHashCode,那么hashCode的值取决于该类的所有field。
可以看出,使用了反射机制来获取类的私有域。
可以使用下列代码,自定义equals、hashCode值的生成/比较规则:
@Override
public boolean equals(Object o) {
boolean equals = false;
if (o != null) {
Student student = (Student) o;
equals = new EqualsBuilder().append(this.name, student.name).isEquals();
}
return equals;
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(name).toHashCode();
}
上述代码,自定义当两个Student对象的name相同时,就认为它俩相等。测试结果:
Student studentOne = new Student();
studentOne.setAge(221);
studentOne.setName("kevin");
Student studentTwo = new Student();
studentTwo.setName("kevin");
studentTwo.setAge(22);
//断言二者equals比较结果为true
Assert.isTrue(studentOne.equals(studentTwo));
如上,即使两个对象的age属性并不相同,但是断言执行仍然通过。
这里只是一些关于EqualsBuilder与HashCodeBuilder的基本使用,有好的文档介绍等烦请不吝分享!