注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

Jakarta commons cookbook 笔记(2)  

2013-03-05 19:09:41|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
自动生成hashCode()和equals()
Commons Lang 包中的EqualsBuilder和HashCodeBuilder类提供了自动生成equals()和hashCode()方法的功能。

import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;

public class Student{
       public int hashCode() {
              return new HashCodeBuilder(17, 37).apend(firstName).apend(lastName).toHashCode();
       }

       public boolean equals(Object o) {
              boolean equals = false;
              if (o != null && Student.class.isAssignableForm(o.getClass())) {
                       Student s = (Student) o;
                       equals = (new EqualsBuilder().append(firstName, ps.firstName).append(lastName, ps.lastName)).isEquals();
              }
              return equals;
       }
}


HashCodeBuilder的构造函数使用两个整数做输入,这两个整数在生成HashCode时充当偏移值,它们必须是非零非偶的质数,拥有相同firstName和lastName的Student 对象将生成相同的hashCode。如果
一个散列码与类中所有域相关,可以通过反射生成它

public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
}


EqualsBuilder类也可以通过append方法进行配置,EqualsBuilder类可以方便的比较传入的参数,可以自己在比较时使用,比如比较两个数组:

int[] array1 = new int[] {1,2,3,4,5};
int[] array2 = new int[] {1,2,3,4,5};

EqualsBuilder builder = new EqualsBuilder();
builder.append(array1, array2);
boolean result = builder.isEquals();


如果两个类相等等价于其所有对应域都相等,那么EqualsBuilder可以通过反射比较两个对象的大小。代码如下:

public boolean equals(Object o) {
    return EqualsBuilder.reflectionEquals(this, o);
}

自动实现compareTo()
Commons Lang 中的CompareToBuilder类为compareTo()方法提供了生成器。它即可以通过反射生成比较,也可以通过CompareToBuilder类的实例传递参数来定制比较
下面的例子显示了如何使用反射生成器生成一个compareTo()方法。该方法比较个类中所有非静态和非瞬时的成员。

import org.apache.commons.lang.builder.CompareToBuilder;

public int compareTo(Object obj) {
    return CompareToBuilder.reflectionCompare(this, obj);
}
CompareToBuilder.reflectionCompare()方法以两个对象做参数,比较它们的非静态且非瞬时的成员变量。比较了Student 对象的姓名,当firstName与lastName的值都相等,对象才相等。
reflectionCompare() 方法忽略了静态成员和transient成员,所以本例中的age和fullName变量都不参与自动生成比较

public class Student {
    //static variable
    private static String age;

    //Member variable
    private String firstName;
    private String lastName;
    private transient String fullName;
    
    //Constructors

    //get set method

    //Build a compateTo function from reflection
    public int compareTo(Object o) {
        return CompareToBuilder.reflectionCompare(this, obj);
    }

}

除了使用反射进行比较, CompareToBuilder还能通过以特定的顺序对一组变量的方法进行比较。在面对多个成员变量的时候,比较的顺序变的关键,而这个顺序并不是在reflectionCompare()中确定的。假设Student对象的顺序是
先lastName后firstName,则只有lastName相同,才比较firstName

定制化的compareTo方法
append()决定那些变量将被比较以及何种顺序比较。调用append()的顺序和比较顺序相反

public int compareTo(Object o) {
    int compare = -1;
    if(o!=null && Student.class.isAssignableFrom(o.getClass())) {
        Student s = (Student) o;
        compare = (new CompareToBuilder().append(firstName, s.firstName).append(lastName, s.lastName)).toComparison();
    }
    return compare;
}
    
切记equals方法和compareTo方法不能有矛盾的地方,以免排序出错。
使用反射方法自动生成compareTo方法可能会与equals方法不同

  评论这张
 
阅读(303)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017