`

自己编写HashCodeBuilder类

    博客分类:
  • java
阅读更多
jakarta-commons-lang已经实现了HashCodeBuilder类,据闻在Hibernate中出错,所以还是选择了自己实现,编码思想来源于 Effective java 一书。而且0依赖。

java 代码
 
  1. import java.lang.reflect.Array;  
  2.   
  3. public class HashCodeBuilder {  
  4.     public HashCodeBuilder() {  
  5.   
  6.     }  
  7.   
  8.     private int result = 17;  
  9.   
  10.     public HashCodeBuilder append(boolean field) {  
  11.         result = 37 * result + (field ? 1 : 0);  
  12.         return this;  
  13.     }  
  14.   
  15.     public HashCodeBuilder append(byte field) {  
  16.         result = 37 * result + (int) field;  
  17.         return this;  
  18.     }  
  19.   
  20.     public HashCodeBuilder append(char field) {  
  21.         result = 37 * result + (int) field;  
  22.         return this;  
  23.     }  
  24.   
  25.     public HashCodeBuilder append(short field) {  
  26.         result = 37 * result + (int) field;  
  27.         return this;  
  28.     }  
  29.   
  30.     public HashCodeBuilder append(int field) {  
  31.         result = 37 * result + field;  
  32.         return this;  
  33.     }  
  34.   
  35.     public HashCodeBuilder append(long field) {  
  36.         result = 37 * result + (int) (field ^ (field >>> 32));  
  37.         return this;  
  38.     }  
  39.   
  40.     public HashCodeBuilder append(float field) {  
  41.         result = 37 * result + Float.floatToIntBits(field);  
  42.         return this;  
  43.     }  
  44.   
  45.     public HashCodeBuilder append(double field) {  
  46.         append(Double.doubleToLongBits(field));  
  47.         return this;  
  48.     }  
  49.   
  50.     public HashCodeBuilder append(Object field) {  
  51.         if(field == null)  
  52.             result = 0;  
  53.         else if (field.getClass().isArray()) {  
  54.             for (int i = Array.getLength(field) - 1; i >= 0; i--) {  
  55.                 append(Array.get(field, i));  
  56.             }  
  57.         } else  
  58.             append(field.hashCode());  
  59.         return this;  
  60.     }  
  61.   
  62.     public int toHashCode() {  
  63.         return result;  
  64.     }  
  65.       
  66.     @Override  
  67.     public int hashCode() {  
  68.         return result;  
  69.     }  
  70.       
  71.     @Override  
  72.     public String toString() {  
  73.         return String.valueOf(result);  
  74.     }  
  75.   
  76. }  



测试代码

java 代码
 
  1. public class MyBean {  
  2.     Long id;  
  3.     String name;  
  4.     char[] chars;  
  5.     public MyBean(Long id, String name, char[] chars) {  
  6.         super();  
  7.         this.id = id;  
  8.         this.name = name;  
  9.         this.chars = chars;  
  10.     }  
  11.       
  12.     @Override  
  13.     public int hashCode() {  
  14.         return new HashCodeBuilder().append(id)  
  15.                     .append(name).append(chars).hashCode();  
  16.     }  
  17.       
  18.     public static void main(String[] args) {  
  19.         MyBean bean1 = new MyBean(Long.valueOf(10),  
  20.                 "名称",new char[]{'a','b','c','d','e'});  
  21.         MyBean bean2 = new MyBean(Long.valueOf(10),  
  22.                 "名称",new char[]{'a','b','c','d','e'});  
  23.         System.out.println("bean1.hashCode="+bean1.hashCode());  
  24.         System.out.println("bean2.hashCode="+bean2.hashCode());  
  25.     }  
  26. }  
分享到:
评论
2 楼 jasongreen 2007-03-15  
我没有用过common-lang,不是太清楚,我最近在写crazyPOJO的项目,通过Annotation标志value field,然后根据value field生成hashCode,生成equals,生成clone,生成toString,生成toXML,生成toJSON,进行中,今天已经实现了,hashCode和equals,clone等方法,一会上传,大家试用一下
1 楼 v38 2007-03-14  
<br/>
<strong>jasongreen 写道:</strong><br/>
<div class='quote_div'>jakarta-commons-lang已经实现了HashCodeBuilder类,据闻在Hibernate中出错,所以还是选择了自己实现,编码思想来源于 Effective java 一书。而且0依赖。<br/>
==========================</div>
<div class='quote_div'>jakarta-commons-lang已实现的HashCodeBuilder类的错误没有把我们给折磨死~</div>
<div class='quote_div'><br/>
<br/>
<br/>
<br/>
</div>

相关推荐

    commons-lang3-3.3.2

    描述中的"hashCodeBuilder EqualsBuilder ToStringBuilder"提到了三个关键的类,它们都是Apache Commons Lang中用于构建对象哈希码、比较平等性和生成字符串表示的重要工具。 1. **HashCodeBuilder**: 在Java中,`...

    Jakarta+Commons中文介绍

    **HashCodeBuilder** 类简化了hashCode方法的编写过程,同样通过链式调用来计算对象的哈希值。 ##### ToStringBuilder **ToStringBuilder** 类简化了toString方法的编写过程,可以通过添加不同的属性来构建字符串...

    apache commons-lang简介

    Commons Lang.jar是Apache Commons Lang项目的主库文件,它包含了许多实用的类和方法,使得开发者在编写Java代码时可以更加高效。这个库已经被广泛地应用于各种Java项目中,成为了许多开发者不可或缺的工具。 2.1....

    关于Java_Collection_API_

    为了确保一致性,推荐使用Apache Commons Lang库中的`HashCodeBuilder`类来生成高质量的`hashCode`值。 - **基于排序二叉树的实现**:`TreeMap`和`TreeSet`采用红黑树数据结构实现,这要求集合中的元素必须具备可...

    Hibernate复合主键

    3. **编写实体类**:实体类中需要包含复合主键对象以及其他属性。 下面通过具体实例来详细讲解这些步骤。 #### 三、实例分析 假设我们有一个用户表`t_user`,其中包含三个字段:`firstname`、`lastname`和`age`。...

    commons-lang3-3.10.rar

    10. **Object utilities**:`Objects`类提供了通用的对象操作,例如`EqualsBuilder`和`HashCodeBuilder`用于构建更安全的equals()和hashCode()方法。 11. **Functional programming**:`Function`、`Predicate`和`...

    apache commons 帮助文档电子书

    这些工具类大大扩展了Java标准库的功能,避免了大量重复代码的编写,同时为开发者提供了更多灵活的编程手段。在实际应用中,合理使用Apache Commons库的工具类可以大幅减少开发成本和错误率。在项目中直接使用...

    commons-lang3-3.5-bin.zip

    在实际开发中,Apache Commons Lang 3.5 可以极大地提高代码的可读性和可维护性,减少重复的代码编写,使得开发更加高效。这个版本还修复了一些已知的问题,提升了性能和稳定性,确保了与其他库的兼容性。 总之,...

    apache commons 包最新使用指南(2009英文)

    - **解决方案**:利用 Commons Lang 的 `HashCodeBuilder` 类自动生成这两个方法。 - **讨论**: - `HashCodeBuilder` 可以根据类中的字段生成正确的哈希码值。 - 同时,通过 `EqualsBuilder` 类可以确保 `equals...

    eclipse插件 org.jiayun.commons4e

    2. 自动生成Equals和HashCode方法:遵循Java Bean规范,基于类的属性生成Equals和HashCode方法,确保对象比较的正确性,同时避免了因手动编写而可能出现的错误。 3. 自动更新:当类新增或删除字段时,插件能自动...

    Apache commons jar包常用类讲解--Jakarta Commons 学习.pdf

    通过以上介绍,我们可以看出Apache Commons项目中的各个库都提供了非常实用的功能,可以帮助开发者更加高效地编写代码。无论是字符串处理、日期时间操作还是集合管理,这些工具类都能极大地提高开发效率并减少出错的...

    Hibernate中对数据库复合主键的支持.pdf

    这里使用了`Objects.equals()`和`Objects.hash()`方法来简化`equals`和`hashCode`方法的编写。另外,也可以通过引入Apache Commons Lang库中的`EqualsBuilder`和`HashCodeBuilder`来进一步简化代码: ```java ...

    1_equals_overridingequals_

    在实践中,为了代码的可读性和一致性,可以考虑使用Apache Commons Lang库的EqualsBuilder和HashCodeBuilder,或者使用Lombok库的@EqualsAndHashCode注解,它们可以帮助我们更方便地生成这些方法。 总的来说,重写...

    org.apache.commons.lang包

    Apache Commons Lang是一个非常重要的Java库,它为Java标准类库提供了许多实用的工具类和扩展。这个资源包包含了丰富的功能,极大地增强了...开发者可以通过使用它来编写更简洁、更易维护的代码,从而提高开发效率。

    commons-lang-2.3

    `EqualsBuilder` 和 `HashCodeBuilder` 则简化了自定义 `equals()` 和 `hashCode()` 方法的编写。 4. **数组操作**:`ArrayUtils` 提供了对 Java 数组的各种操作,包括添加、删除、填充、转换、比较等。它还提供了...

    commons-lang3-3.7

    `Builder` 包中的类如 `ToStringBuilder`, `HashCodeBuilder` 提供了一种构建对象的toString()和hashCode()方法的简便方式,遵循了良好的编程实践。 9. **枚举工具** `EnumUtils` 提供了枚举相关的辅助方法,如...

    common-lang3.jar

    总结,`common-lang3.jar`是Java开发者的得力助手,它提供的各种工具类极大地简化了代码编写,提升了开发效率。无论是字符串处理、日期操作,还是反射和异常处理,都体现了其强大的功能和易用性。在实际项目中,合理...

    JAVA中实现“相等”比较的深入分析.zip

    实现`equals()`和`hashCode()`的一个常见模式是使用Apache Commons Lang库的`EqualsBuilder`和`HashCodeBuilder`,它们可以简化代码并减少错误的可能性。 此外,还要注意`equals()`和`compareTo()`的区别。`...

    Jakarta Commons CookBook学习笔记

    `EqualsBuilder` 和 `HashCodeBuilder` 是 Apache Commons Lang 包中提供的两个工具类,用于简化 `equals()` 和 `hashCode()` 方法的实现。这些方法对于 Java 对象来说非常重要,尤其是在将对象放入集合(如 HashSet...

    对比文件数据是否一致(全量数据)

    对于更复杂的数据格式,可以使用库如Apache Commons Lang的`EqualsBuilder`或`HashCodeBuilder`,或者使用Google的Guava库的`Equivalence`类来比较对象的属性。对于CSV数据,Apache Commons CSV库可以帮助我们解析...

Global site tag (gtag.js) - Google Analytics