自动化hashCode()和equals()
问题产生:当需要自动实现hashCode()和equals()方法
解决方法:使用EqualsBuilder和HashCodeBuilder
使用举例:
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;

public class PoliticalCandidate {
// Member variables - omitted for brevity
// Constructors - omitted for brevity
// get/set methods - omitted for brevity
// A hashCode which creates a hash from the two unique identifiers
public int hashCode( ) {
return new HashCodeBuilder( 17 , 37 )
.append(firstName)
.append(lastName).toHashCode( );
}
// An equals which compares two unique identifiers
public boolean equals(Object o) {
boolean equals = false ;
if ( o != null && PoliticalCandidate. class .isAssignableFrom(o) ) {
PoliticalCandidate pc = (PoliticalCandidate) o;
equals = ( new EqualsBuilder( )
.append(firstName, ps.firstName)
.append(lastName, ps.lastName)).isEquals( );
}
return equals;
}
}
Discussion:
1.在上述例子中,当有相同的firstname和lastname时,认为两个对象的hashCode相同,从而equals()返回true.
如果hashCode取决于该class的所有filed时需要使用反射机制来产生一个hashCode。
public int hashCode( ) {
return HashCodeBuilder.reflectionHashCode( this );
}
和ToStringBuilder 与 HashCodeBuilder一样EqualsBuilder 也是使用append()方法进行配置, EqualsBuilder的append()方法可以接受基本类型、对象、数组作为参数。EqualsBuilder强大的地方在于可以直接把数组作为参数传入append()方法,EqualsBuilder会依次比较数组中的每个元素。
2.如果两个对象相等当且仅当每个属性值都相等 这句话可以由以下代码实现:
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals( this , o);
}
问题提出:需要快速实现compareTo()方法
解决方法:使用CompareToBuilder提供的compareTo()方法。同样的CompareToBuilder也使用了反射机制。以下代码提供了一个compareTo()方法,用于比较两个对象所有的非static和非transient成员变量。
import org.apache.commons.lang.builder.CompareToBuilder;

// Build a compareTo function from reflection
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare( this , obj);

}
Discussion: CompareToBuilder.reflectionCompare()提供了两个对象non-static和nontransient成员变量的方法。 reflectionCompare()方法不予理会static和transient变量,因此以下代码中的averageAge和fullName变量是不会进入比较表达式的。
public class PoliticalCandidate {
// Static variable
private static String averageAge;

// Member variables
private String firstName;
private String lastName;

private transient String fullName;
// Constructors
// get/set methods
// Build a compareTo function from reflection
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare( this , obj);
}
}
比较对象成员变量的时候应该有一个比较的次序存在,上述代码中默认的应该是先比较lastName,然后是firstName。调用append()方法可以把要比较的变量加入比较表达式中,并且遵循后加入的先比较的次序。
例如:
public int compareTo(Object o) {
int compare = - 1 ; // By default return less-than
if ( o != null && PoliticalCandidate. class .isAssignableFrom( o.getClass( ) ) ) {

PoliticalCandidate pc = (PoliticalCandidate) o;
compare = ( new CompareToBuilder( )
.append(firstName, pc.firstName)
.append(lastName, pc.lastName)).toComparison( );
}
return compare;
}
在比较的时候会先比较lastName,只有在lastName相同的情况下才会比较firstName。
ps:实现compareTo()的时候应保证和equals()规则相同,即当compareTo()返回是0的时候equals()应该返回true。
本笔记是在阅读Jakarta Commons Cookbook时所留下的。
1.使用ReflectionToStringBuilder 或者ToStringBuilder 自动产生toString()的内容。
使用举例:假设有一个表征校长候选人信息的javabean-PoliticalCandidate。
该bean里面有个toString()方法,假设有以下操作:
假设State对象也是一个使用ReflectionToStringBuilder的javabean,上述程序一种可能的输出为com.discursive.jccook.lang.builders.PoliticalCandidate@187aeca
[lastName=Jefferson,\firstName=Thomas,
dateOfBirth=Sat Apr 13 22:38:42 CST 1743,
moneyRaised=\293829292.930000007152557373046875,
state=\com.discursive.jccook.lang.builders.State@87816d
[abbreviation=VA,name=Virginia]]
org.apache.commons.lang.builder
CompareToBuilder – 用于辅助实现Comparable.compareTo(Object)方法;
EqualsBuilder – 用于辅助实现Object.equals()方法;
HashCodeBuilder – 用于辅助实现Object.hashCode()方法;
ToStringBuilder – 用于辅助实现Object.toString()方法;
ReflectionToStringBuilder – 使用反射机制辅助实现Object.toString()方法;
ToStringStyle – 辅助ToStringBuilder控制输出格式;
StandardToStringStyle – 辅助ToStringBuilder控制标准格式。
分享到:
相关推荐
org.apache.commons.lang.builder.HashCodeBuilder.class org.apache.commons.lang.builder.ReflectionToStringBuilder$1.class org.apache.commons.lang.builder.ReflectionToStringBuilder.class org.apache....
对比两个实体类,可能涉及到对象的属性比较,例如使用Apache的EqualsBuilder和HashCodeBuilder来实现对象的equals()和hashCode()方法,以确保对象内容一致时返回相同的结果。此外,还可以使用Lombok库的@...
org.apache.commons.lang.builder.HashCodeBuilder.class org.apache.commons.lang.builder.ReflectionToStringBuilder$1.class org.apache.commons.lang.builder.ReflectionToStringBuilder.class org.apache....
import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder;
这个包主要是为了提供对象构建和比较的工具,如ToStringBuilder、HashCodeBuilder和EqualsBuilder,它们帮助开发者生成对象的toString、hashCode和equals方法,避免了重复的样板代码。 以上只是Commons Lang的一...
在实践中,为了代码的可读性和一致性,可以考虑使用Apache Commons Lang库的EqualsBuilder和HashCodeBuilder,或者使用Lombok库的@EqualsAndHashCode注解,它们可以帮助我们更方便地生成这些方法。 总的来说,重写...
4. 配置友好:org.jiayun.commons4e插件提供了丰富的配置选项,允许用户根据项目需求定制生成的代码格式,如是否忽略特定字段,是否使用Apache Commons Lang的EqualsBuilder和HashCodeBuilder等。 安装此插件,用户...
Apache Commons Lang 库中的 `EqualsBuilder` 和 `HashCodeBuilder` 以及 `ArrayUtils` 提供了一系列实用的功能,使得开发者能够更加高效地处理对象和数组的操作。这些工具不仅简化了代码编写过程,还提高了程序的...
此外,`EqualsBuilder`和`HashCodeBuilder`是构建自定义equals()和hashCode()方法的强大工具,它们遵循了Java equals()和hashCode()的一致性原则。`ToStringBuilder`则帮助创建对象的toString()方法输出,使得调试和...
`EqualsBuilder`和`HashCodeBuilder`帮助构建自定义的equals()和hashCode()方法,确保对象比较的正确性。 6. 集合操作: `CollectionUtils`和`ArrayUtils`提供了丰富的集合和数组操作,如查找、过滤、合并、反转等...
描述中的"hashCodeBuilder EqualsBuilder ToStringBuilder"提到了三个关键的类,它们都是Apache Commons Lang中用于构建对象哈希码、比较平等性和生成字符串表示的重要工具。 1. **HashCodeBuilder**: 在Java中,`...
- CompareToBuilder、EqualsBuilder和HashCodeBuilder:提供了简化对象比较和哈希码计算的构建器模式方法。 - ToStringBuilder和ToStringStyle:用于自定义对象的toString()方法输出格式。 2. Jakarta Commons ...
#### 十一、EqualsBuilder、HashCodeBuilder 和 ToStringBuilder 的应用 这三个类都是为了方便地创建 `equals()`、`hashCode()` 和 `toString()` 方法。 - **EqualsBuilder**: 构建 `equals()` 方法。 - **...
Apache Commons是一系列开源的Java通用工具类库,提供了很多常用的工具类和方法,可以在项目中简化代码,提高开发效率。其内容覆盖了字符串操作、数据类型转换、集合处理、数学计算、日期和时间处理、Bean操作等众多...
Equator interface 的实现可以使用 Apache Commons 的 EqualsBuilder 和 HashCodeBuilder 类。例如: ```java private static <T> Equator<T> generateEquator(final String... excludedFields) { Equator<T> ...
java包。 import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder;
org.apache.commons.lang.builder.HashCodeBuilder.class org.apache.commons.lang.builder.ReflectionToStringBuilder$1.class org.apache.commons.lang.builder.ReflectionToStringBuilder.class org.apache....
例如,`StringUtils`类提供了大量的静态方法来处理字符串,`ArrayUtils`提供了数组操作的方法,而`EqualsBuilder`和`HashCodeBuilder`则帮助我们更安全地实现对象的equals()和hashCode()方法。 3. **Apache Commons...
Apache Commons 是一个由 Apache 软件基金会维护的一系列 Java 工具类库,旨在为 Java 开发者提供一系列可复用的组件和服务。本指南详细介绍了 2009 年版本中的各种实用功能,对于当时的 Java 开发者来说具有重要的...
`EqualsBuilder` 和 `HashCodeBuilder` 则帮助实现自定义的 equals() 和 hashCode() 方法。 7. **异常处理**:`ExceptionUtils` 提供了处理和包装异常的功能,简化异常处理代码。 8. **其他工具类**:`ArrayUtils`...