自己编写HashCodeBuilder类

xiaoguanmeizi 2007-03-14

jakarta-commons-lang已经实现了HashCodeBuilder类,据闻在Hibernate中出错,所以还是选择了自己实现,编码思想来源于Effectivejava一书。而且0依赖。

import java.lang.reflect.Array;  
      
    public class HashCodeBuilder {  
        public HashCodeBuilder() {  
      
        }  
      
        private int result = 17;  
      
        public HashCodeBuilder append(boolean field) {  
            result = 37 * result + (field ? 1 : 0);  
            return this;  
        }  
      
        public HashCodeBuilder append(byte field) {  
            result = 37 * result + (int) field;  
            return this;  
        }  
      
        public HashCodeBuilder append(char field) {  
            result = 37 * result + (int) field;  
            return this;  
        }  
      
        public HashCodeBuilder append(short field) {  
            result = 37 * result + (int) field;  
            return this;  
        }  
      
        public HashCodeBuilder append(int field) {  
            result = 37 * result + field;  
            return this;  
        }  
      
        public HashCodeBuilder append(long field) {  
            result = 37 * result + (int) (field ^ (field >>> 32));  
            return this;  
        }  
      
        public HashCodeBuilder append(float field) {  
            result = 37 * result + Float.floatToIntBits(field);  
            return this;  
        }  
      
        public HashCodeBuilder append(double field) {  
            append(Double.doubleToLongBits(field));  
            return this;  
        }  
      
        public HashCodeBuilder append(Object field) {  
            if(field == null)  
                result = 0;  
            else if (field.getClass().isArray()) {  
                for (int i = Array.getLength(field) - 1; i >= 0; i--) {  
                    append(Array.get(field, i));  
                }  
            } else  
                append(field.hashCode());  
            return this;  
        }  
      
        public int toHashCode() {  
            return result;  
        }  
          
        @Override  
        public int hashCode() {  
            return result;  
        }  
          
        @Override  
        public String toString() {  
            return String.valueOf(result);  
        }  
      
    }  

测试代码

public class MyBean {  
        Long id;  
        String name;  
        char[] chars;  
        public MyBean(Long id, String name, char[] chars) {  
            super();  
            this.id = id;  
            this.name = name;  
            this.chars = chars;  
        }  
          
        @Override  
        public int hashCode() {  
            return new HashCodeBuilder().append(id)  
                        .append(name).append(chars).hashCode();  
        }  
          
        public static void main(String[] args) {  
            MyBean bean1 = new MyBean(Long.valueOf(10),  
                    "名称",new char[]{'a','b','c','d','e'});  
            MyBean bean2 = new MyBean(Long.valueOf(10),  
                    "名称",new char[]{'a','b','c','d','e'});  
            System.out.println("bean1.hashCode="+bean1.hashCode());  
            System.out.println("bean2.hashCode="+bean2.hashCode());  
        }  
    }  

相关推荐