论坛首页 Java企业应用论坛

自己编写HashCodeBuilder类

浏览 4455 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-14  
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. }  
   发表时间:2007-03-14  

jasongreen 写道:
jakarta-commons-lang已经实现了HashCodeBuilder类,据闻在Hibernate中出错,所以还是选择了自己实现,编码思想来源于 Effective java 一书。而且0依赖。
==========================
jakarta-commons-lang已实现的HashCodeBuilder类的错误没有把我们给折磨死~




0 请登录后投票
   发表时间:2007-03-15  
我没有用过common-lang,不是太清楚,我最近在写crazyPOJO的项目,通过Annotation标志value field,然后根据value field生成hashCode,生成equals,生成clone,生成toString,生成toXML,生成toJSON,进行中,今天已经实现了,hashCode和equals,clone等方法,一会上传,大家试用一下
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics