`

在看commons-lang.jar包源码时候的一些发现及实践

    博客分类:
  • java
阅读更多

通常,我们在完成一个标准的JavaBean的时候,都需要同时完成equals,toString和hashCode三个方法,一般手动来写的话,实在是很麻烦,特别是如果一个JavaBean中有复杂的数据类型,如集合类型,日期类型等这种情况下,做起来更让人头痛。

于是我用了common-lang.jar这个包里面的一些类来帮我做这三个令人厌烦的工作,比如我现在有一个简单JavaBean,代码如下:

Java代码 复制代码
  1. public class GenericModel implements Serializable {   
  2.     private static final long serialVersionUID = 3294254521331173014L;   
  3.     protected String id;   
  4.     protected Date createTime;   
  5.     protected Date updateTime;   
  6.   
  7.     public Date getCreateTime() {   
  8.         return createTime;   
  9.     }   
  10.   
  11.     public void setCreateTime(Date createTime) {   
  12.         this.createTime = createTime;   
  13.     }   
  14.   
  15.     public String getId() {   
  16.         return id;   
  17.     }   
  18.   
  19.     public void setId(String id) {   
  20.         this.id = id;   
  21.     }   
  22.   
  23.     public Date getUpdateTime() {   
  24.         return updateTime;   
  25.     }   
  26.   
  27.     public void setUpdateTime(Date updateTime) {   
  28.         this.updateTime = updateTime;   
  29.     }   
  30.        
  31.     public boolean equals(Object object) {   
  32.         return EqualsBuilder.reflectionEquals(this, object);   
  33.     }   
  34.        
  35. }  
public class GenericModel implements Serializable {
    private static final long serialVersionUID = 3294254521331173014L;
    protected String id;
    protected Date createTime;
    protected Date updateTime;

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
	
    public boolean equals(Object object) {
        return EqualsBuilder.reflectionEquals(this, object);
    }
	
}



以上是一个很简单的POJO,要用commons-lang.jar里面的builder来生成这三个方法也很简单,具体做法如下。
1. 生成对应的equals方法:

Java代码 复制代码
  1. public boolean equals(Object obj){   
  2.     if (obj == null) {return false;}   
  3.     if (obj == this) {return true;}   
  4.     if (obj.getClass() != getClass()) {return false;}   
  5.   
  6.     GenericModel gm= (GenericModel) obj;   
  7.     return new EqualsBuilder()   
  8.         .append(id, gm.getId())   
  9.         .append(createTime , gm.getCreateTime())   
  10.         .append(updateTime, gm.getUpdateTime())   
  11.         .isEquals();   
  12. }  
public boolean equals(Object obj){
    if (obj == null) {return false;}
    if (obj == this) {return true;}
    if (obj.getClass() != getClass()) {return false;}

    GenericModel gm= (GenericModel) obj;
    return new EqualsBuilder()
        .append(id, gm.getId())
        .append(createTime , gm.getCreateTime())
        .append(updateTime, gm.getUpdateTime())
        .isEquals();
}



2. 生成对应的hashCode方法:

Java代码 复制代码
  1. public int hashCode() {   
  2.     return new HashCodeBuilder(1737)   
  3.     .append(id)   
  4.     .append(createTime)   
  5.     .append(updateTime)   
  6.     .toHashCode();   
  7.    }  
public int hashCode() {
    return new HashCodeBuilder(17, 37)
    .append(id)
    .append(createTime)
    .append(updateTime)
    .toHashCode();
   }


注意使用HashCodeBuilder的时候,构造方法的两个整数必须不为零且必须为奇数,HashCodeBuilder的构造函数如下:

Java代码 复制代码
  1. public HashCodeBuilder(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber) {   
  2.     if (initialNonZeroOddNumber == 0) {   
  3.         throw new IllegalArgumentException("HashCodeBuilder requires a non zero initial value");   
  4.     }   
  5.     if (initialNonZeroOddNumber % 2 == 0) {   
  6.         throw new IllegalArgumentException("HashCodeBuilder requires an odd initial value");   
  7.     }   
  8.     if (multiplierNonZeroOddNumber == 0) {   
  9.         throw new IllegalArgumentException("HashCodeBuilder requires a non zero multiplier");   
  10.     }   
  11.     if (multiplierNonZeroOddNumber % 2 == 0) {   
  12.         throw new IllegalArgumentException("HashCodeBuilder requires an odd multiplier");   
  13.     }   
  14.     iConstant = multiplierNonZeroOddNumber;   
  15.     iTotal = initialNonZeroOddNumber;   
  16. }  
public HashCodeBuilder(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber) {
    if (initialNonZeroOddNumber == 0) {
        throw new IllegalArgumentException("HashCodeBuilder requires a non zero initial value");
    }
    if (initialNonZeroOddNumber % 2 == 0) {
        throw new IllegalArgumentException("HashCodeBuilder requires an odd initial value");
    }
    if (multiplierNonZeroOddNumber == 0) {
        throw new IllegalArgumentException("HashCodeBuilder requires a non zero multiplier");
    }
    if (multiplierNonZeroOddNumber % 2 == 0) {
        throw new IllegalArgumentException("HashCodeBuilder requires an odd multiplier");
    }
    iConstant = multiplierNonZeroOddNumber;
    iTotal = initialNonZeroOddNumber;
}



3. 生成toString方法:

Java代码 复制代码
  1. public String toString() {   
  2.     return new ToStringBuilder(this)   
  3.     .append("id", id)   
  4.     .append("createTime", createTime)   
  5.     .append("updateTime", updateTime)   
  6.     .toString();   
  7. }  
public String toString() {
    return new ToStringBuilder(this)
    .append("id", id)
    .append("createTime", createTime)
    .append("updateTime", updateTime)
    .toString();
}



好了,这也是一般我们用这个玩意儿的用法,但即使这种情况,我们仍然需要手动维护如此多的属性,有没有一种方式更加简单,可以让代码更简化呢?

有的,再看这几个类里面有这几个方法:
EqualsBuilder.reflectionEquals
HashCodeBuilder.reflectionHashCode
ToStringBuilder.reflectionToString
这几个方法是利用Java的反射机制,自动找到相应的属性,自动生成这几个方法。好了上面的代码就可以改一下了:

Java代码 复制代码
  1. public boolean equals(Object object) {   
  2.     return EqualsBuilder.reflectionEquals(this, object);   
  3. }   
  4.        
  5. public int hashCode(){   
  6.     return HashCodeBuilder.reflectionHashCode(this);   
  7. }   
  8.        
  9. public String toString(){   
  10.     return ToStringBuilder.reflectionToString(this);   
  11. }  
public boolean equals(Object object) {
    return EqualsBuilder.reflectionEquals(this, object);
}
	
public int hashCode(){
    return HashCodeBuilder.reflectionHashCode(this);
}
	
public String toString(){
    return ToStringBuilder.reflectionToString(this);
}



好了,这样看上去就好多了。接下来再多说几句多余的。也是这三个方法的实用价值所在。

我们一般在进行建模的时候,所有的域对象一般都会有一个基类,我上面这个GenericModel也就是一个基类,那么我们项目中的所有域对象都继承自这个基类。同时也就继承了这三个方法。也就是,只要我们新的JavaBean都扩展了GenericModel这个类,那么在我们的新的JavaBean里面就不再需要声明这三个方法,这三个方法自动实现了。

分享到:
评论
1 楼 seekgirl 2009-03-11  
不错是不错,可惜hibernate 实体类不能这么用

相关推荐

    commons-lang-2.6.jar包

    commons-lang-2.6.jar包commons-lang-2.6.jar包commons-lang-2.6.jar包commons-lang-2.6.jar包commons-lang-2.6.jar包加源码

    apache commons 常用jar包 commons-validator commons-transaction commons-lang等

    jar包大小:239KB commons-lang-2.3.jar jar包大小:237KB commons-lang-2.2.jar jar包大小:202KB commons-lang-2.1.jar jar包大小:165KB commons-lang-2.0.jar jar包大小:278KB commons-jxpath-1.2.jar jar包大小:129...

    commons-lang-2.4.rar代码及jar文件

    commons-lang-2.4.rar代码及jar文件

    commons-lang-2.5-sources.jar源码jar包

    commons-lang-2.5-sources.jar源码包

    org.apache.commons 常用jar 以及部分源码

    以下是压缩文件的jar包名称: commons-validator-1.3.0.jar commons-pool-1.3.jar commons-net-3.0.jar commons-logging-api-1.1.jar commons-logging-1.0.4.jar commons-lang-2.1.jar commons-io-1.3.2.jar commons...

    commons-lang3-3.5源码1

    ( commons-lang3-3.5源码与jar包

    jar包 commons-lang3-3.4.jar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    commons-lang-2.5 jar包和源码包

    commons-lang-2.5 jar包和源码包

    commons-lang3-3.3.2.rar

    commons-lang3-3.3.2.rar jar包 src源码

    commons-lang-3-3.1 jar包和源码包

    commons-lang-3-3.1 jar包和源码包

    commons-lang-2.5-sources.jar

    跟java.lang这个包的作用类似,Commons Lang这一组API也是提供一些基础的、通用的操作和处理,如自动生成toString()的结果、自动实现hashCode()和equals()方法、数组操作、枚举、日期和时间的处理等等。

    commons-lang3-3.7.jar 和sources.jar

    jar包和源码. Apache Commons包是Java中使用广泛的工具包,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,JDK没能提供的机能,最大化的减少重复代码的编写。 Commons Lang是对JDK中java....

    jedis-2.9.0.jar

    jedis-2.9.0 jar 包,不包含源码,源码下载地址: http://download.csdn.net/download/tan3739/9993938 测试代码: 导入依赖包: commons-lang-2.5.jar commons-pool2-2.4.2.jar jedis-2.9.0 jar public static ...

    commons-lang-2.6-bin.rar

    commons-lang-2.6-bin.rar commons-lang-2.6 jar包,源码,文档

    org.apache.commons.lang包

    Apache Commons Lang资源包,下载解压缩后,可获得api文档,源码,jar包,用于开发

    commons-lang3-3.3.1.rar

    commons-lang3-3.3.1.rar jar包 src源码 maven

    commons-lang-2.4(jar包及源码包)

    Apache Commons Lang提供了这些额外的方法。 Lang为java.lang API提供了大量的辅助工具,特别是字符串操作方法,基本数值方法,对象反射,并发性,创建和序列化以及系统属性。此外,它还包含对java.util.Date的基本...

    apache-commons源码及jar文件

    (附件中提供了该工具包的jar包,及源文件以供研究) BeanUtils Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt Betwixt提供将 JavaBean 映射至 XML 文档,以及相反映射的服务. Chain Chain 提供...

    json-lib jar包 源代码

    里面包括要使用 json-lib 所要用到的所有包。另外还有 json-lib 的源码。可以在 eclipse 里查看源码。 commons-logging.jar commons-lang.jar commons-beanutil.jar commons-collections.jar ezmorph.jar

    json-lib-2.4-jdk14.jar

    官网发布的json-lib-2.4-jdk...本jar包经过改造,适用于JDK1.4,需要第三方JAR包的支持(commons-beanutils-1.8.2.jar,commons-collections-3.2.jar,commons-lang-2.5.jar,commons-logging-1.1.jar,ezmorph-1.0.6.jar)

Global site tag (gtag.js) - Google Analytics