EqualsBuilder和HashCodeBuilder

自动化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。

1.1 ReflectionToStringBuilder

本笔记是在阅读Jakarta Commons Cookbook时所留下的。
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控制标准格式。

转载于:https://www.cnblogs.com/cglWorkBook/p/4788779.html

EqualsBuilder和HashCodeBuilder相关推荐

  1. hash和hashcode_Hibernate事实:等于和HashCode

    hash和hashcode 每个Java对象都继承了equals和hashCode方法,但它们仅对Value对象有用,对面向无状态行为的对象没有用. 尽管使用" =="运算符比较引 ...

  2. 休眠事实:等于和HashCode

    每个Java对象都继承了equals和hashCode方法,但它们仅对Value对象有用,对面向无状态行为的对象毫无用处. 尽管使用" =="运算符比较引用很简单,但是对于对象相等 ...

  3. 番石榴的对象类:Equals,HashCode和ToString

    如果您有幸使用JDK 7 ,那么新的可用Objects类 ( 至少对我来说 )是实现"通用" Java对象方法(例如equals(Object) [with Objects.equ ...

  4. 在Java里重写equals和hashCode要注意什么问题

    问题:在Java里重写equals和hashCode要注意什么问题 重写equals和hashCode有哪些问题或者陷阱需要注意? 回答一 理论(对于语言律师或比较倾向于数学的人): equals() ...

  5. 使用第三方工具覆写Object中方法

    我们在实际开发中,经常需要覆写Object中的equals,hashcode,toString方法,其实编写这些代码并不是很难,但很枯燥和乏味. 下面推荐Google的Guava jar包来覆写上面的 ...

  6. spring in action 4 第5章

    代码结构 域对象 spittle.java package _5BuildingSpringwebapplications.domain;import java.util.Date;import or ...

  7. cas+shiro+spring 单点登录

    2019独角兽企业重金招聘Python工程师标准>>> 最近公司在搞单点登录,之前也做过,用的是58同城的wf框架,基于cas 的原理用拦截器自己写的一套.目前用cas+shiro+ ...

  8. 二叉查找树 Java实现

    定义: 一棵二叉查找树是一棵二叉树,每个节点都含有一个Comparable的键(以及对应的值). 每个节点的键都大于左子树中任意节点的键而小于右子树中任意节点的键. 树的术语: Name Functi ...

  9. JavaIO4--ObjectInputStream和ObjectOutputStream

    2019独角兽企业重金招聘Python工程师标准>>> ObjectInputStream 和 ObjectOutputStream 介绍 ObjectInputStream 和 O ...

最新文章

  1. 交换机启用光口命令_如何在思科交换机上查询光模块状态?
  2. backbone学习总结(二)
  3. 2019年,智慧零售是如何影响零售行业?
  4. LabviewRS232串口通信数据格式问题解析
  5. 【学习笔记】Django
  6. 0401互联网新闻 | 企业微信新版发布;阿里巴巴发布“AI谣言粉碎机”
  7. 1.网络工具:ifconfig,ping,netstate,Redhat命令和图形化设置ip,finger,nslookup
  8. 把数据保存到cook_JavaScript数据存储 Cookie篇
  9. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用41
  10. canvas 粒子效果 - 手残实践纪录
  11. HRBP与HRM的区别是什么?
  12. SVN仓库安装、备份和迁移基本操作
  13. 学c语言前要了解什么软件,学习c语言需要什么软件?
  14. 软件项目成本估算的基本方法
  15. 基于verilog的uart协议实现
  16. 高效能人士的第三个习惯——要事第一
  17. vue 时间格式总结及转换
  18. Facebook账号注册步骤
  19. 博士申请 | 华东师范大学张凯教授课题组招收图神经网络方向博士生
  20. urllib库学习 - 京东商城手机图片爬虫

热门文章

  1. Web Service简洁版调用公开手机api
  2. java 异常堆栈输出_打印Java异常堆栈信息
  3. 【机器学习】NMF(非负矩阵分解)
  4. 字符串里解析vue表达式
  5. 使用OpenCV进行多边形绘制和填充
  6. Java学习小代码(1)编写三个数的排序程序
  7. HBase 1.x Coprocessor使用指南
  8. Scanf连续调用多次并且存在%c的问题
  9. spark中flatMap函数用法
  10. iOS 混合网页开发 问题