首页 技术 正文
技术 2022年11月18日
0 收藏 822 点赞 4,566 浏览 3370 个字

EqualsBuilder和HashCodeBuilder

自动化hashCode()和equals()
  问题产生:当需要自动实现hashCode()和equals()方法
  解决方法:使用EqualsBuilder和HashCodeBuilder 
  使用举例:

EqualsBuilder和HashCodeBuilder(重写equal和hashcode) import  org.apache.commons.lang.builder.HashCodeBuilder;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) import  org.apache.commons.lang.builder.EqualsBuilder;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) public   class  PoliticalCandidate  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  Member variables – omitted for brevity
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  Constructors – omitted for brevity
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  get/set methods – omitted for brevity
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  A hashCode which creates a hash from the two unique identifiers 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)      public   int  hashCode( )  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)         return   new  HashCodeBuilder( 17 ,  37 )
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)                       .append(firstName)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)                       .append(lastName).toHashCode( );
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)    } 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  An equals which compares two unique identifiers 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)      public   boolean  equals(Object o)  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)         boolean  equals  =   false ;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)         if  ( o  !=   null   && PoliticalCandidate. class .isAssignableFrom(o) )  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)            PoliticalCandidate pc  =  (PoliticalCandidate) o;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)            equals  =  ( new  EqualsBuilder( )
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)                       .append(firstName, ps.firstName)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)                       .append(lastName, ps.lastName)).isEquals( );
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)        } 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)         return  equals;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)    } 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)

Discussion:
1.在上述例子中,当有相同的firstname和lastname时,认为两个对象的hashCode相同,从而equals()返回true.
如果hashCode取决于该class的所有filed时需要使用反射机制来产生一个hashCode。

EqualsBuilder和HashCodeBuilder(重写equal和hashcode) public   int  hashCode( )  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     return  HashCodeBuilder.reflectionHashCode( this );
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)}

和ToStringBuilder 与 HashCodeBuilder一样EqualsBuilder 也是使用append()方法进行配置, EqualsBuilder的append()方法可以接受基本类型、对象、数组作为参数。EqualsBuilder强大的地方在于可以直接把数组作为参数传入append()方法,EqualsBuilder会依次比较数组中的每个元素。
2.如果两个对象相等当且仅当每个属性值都相等 这句话可以由以下代码实现:

EqualsBuilder和HashCodeBuilder(重写equal和hashcode) public   boolean  equals(Object o)  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     return  EqualsBuilder.reflectionEquals( this , o);
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)}

问题提出:需要快速实现compareTo()方法
解决方法:使用CompareToBuilder提供的compareTo()方法。同样的CompareToBuilder也使用了反射机制。以下代码提供了一个compareTo()方法,用于比较两个对象所有的非static和非transient成员变量。

EqualsBuilder和HashCodeBuilder(重写equal和hashcode) import  org.apache.commons.lang.builder.CompareToBuilder;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) //  Build a compareTo function from reflection  
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) public   int  compareTo(Object o)  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     return  CompareToBuilder.reflectionCompare( this , obj);
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)}

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

EqualsBuilder和HashCodeBuilder(重写equal和hashcode) public   class  PoliticalCandidate  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  Static variable 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)      private   static  String averageAge;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  Member variables  
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)      private  String firstName;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     private  String lastName;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     private   transient  String fullName;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  Constructors
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  get/set methods
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     //  Build a compareTo function from reflection  
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)      public   int  compareTo(Object o)  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)         return  CompareToBuilder.reflectionCompare( this , obj);
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)    } 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)}

比较对象成员变量的时候应该有一个比较的次序存在,上述代码中默认的应该是先比较lastName,然后是firstName。调用append()方法可以把要比较的变量加入比较表达式中,并且遵循后加入的先比较的次序。
例如:

EqualsBuilder和HashCodeBuilder(重写equal和hashcode) public   int  compareTo(Object o)  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     int  compare  =   – 1 ;  //  By default return less-than 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)      if ( o  !=   null   &&  PoliticalCandidate. class .isAssignableFrom( o.getClass( ) ) )  {
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)            PoliticalCandidate pc  =  (PoliticalCandidate) o;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)            compare  =  ( new  CompareToBuilder( )
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)                          .append(firstName, pc.firstName)
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)                          .append(lastName, pc.lastName)).toComparison( );
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)    } 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode) 
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)     return  compare;
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)}

在比较的时候会先比较lastName,只有在lastName相同的情况下才会比较firstName。
ps:实现compareTo()的时候应保证和equals()规则相同,即当compareTo()返回是0的时候equals()应该返回true。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,489
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,904
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,737
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,490
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,128
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,291