自動化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。
ReflectionToStringBuilder
1.使用ReflectionToStringBuilder 或者ToStringBuilder 自動產生toString()的內容。 使用舉例:假設有一個表征校長候選人信息的javabean-PoliticalCandidate。

public class PoliticalCandidate
{
private String lastName;
private String firstName;
private Date dateOfBirth;
private BigDecimal moneyRaised;
private State homeState;
// get/set方法省略

public void toString( )
{
ReflectionToStringBuilder.toString( this );
}
}
該bean里面有個toString()方法,假設有以下操作:
// Create a State
State va = new State( "VA", "Virginia");
// Create a Birth Date
Calendar calendar = new GregorianCalendar( );
calendar.set( Calendar.YEAR, 1743 );
calendar.set( Calendar.MONTH, Calendar.APRIL );
calendar.set( Calendar.DAY_OF_MONTH, 13 );
Date dob = calendar.getTime( );
BigDecimal moneyRaised = new BigDecimal( 293829292.93 );
// Create a Political Candidate
PoliticalCandidate candidate = new PoliticalCandidate( "Jefferson", "Thomas", dob, moneyRaised, va );
System.out.println( candidate );
假設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控制標準格式。