首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > Apache >

apache 中的EqualsBuilder跟HashCodeBuilder

2012-11-03 
apache 中的EqualsBuilder和HashCodeBuilder自动化hashCode()和equals()? 问题产生:当需要自动实现hashCod

apache 中的EqualsBuilder和HashCodeBuilder

自动化hashCode()和equals()
? 问题产生:当需要自动实现hashCode()和equals()方法
? 解决方法:使用EqualsBuilder和HashCodeBuilder?
? 使用举例:
?

apache 中的EqualsBuilder跟HashCodeBuilder?import??org.apache.commons.lang.builder.HashCodeBuilder;
apache 中的EqualsBuilder跟HashCodeBuilder?import??org.apache.commons.lang.builder.EqualsBuilder;
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder?public???class??PoliticalCandidate??{
apache 中的EqualsBuilder跟HashCodeBuilder?????//??Member?variables?-?omitted?for?brevity
apache 中的EqualsBuilder跟HashCodeBuilder?????//??Constructors?-?omitted?for?brevity
apache 中的EqualsBuilder跟HashCodeBuilder?????//??get/set?methods?-?omitted?for?brevity
apache 中的EqualsBuilder跟HashCodeBuilder?????//??A?hashCode?which?creates?a?hash?from?the?two?unique?identifiers?
apache 中的EqualsBuilder跟HashCodeBuilder?
apache 中的EqualsBuilder跟HashCodeBuilder??????public???int??hashCode(?)??{
apache 中的EqualsBuilder跟HashCodeBuilder?????????return???new??HashCodeBuilder(?17?,??37?)
apache 中的EqualsBuilder跟HashCodeBuilder???????????????????????.append(firstName)
apache 中的EqualsBuilder跟HashCodeBuilder???????????????????????.append(lastName).toHashCode(?);
apache 中的EqualsBuilder跟HashCodeBuilder????}?
apache 中的EqualsBuilder跟HashCodeBuilder?
apache 中的EqualsBuilder跟HashCodeBuilder?????//??An?equals?which?compares?two?unique?identifiers?
apache 中的EqualsBuilder跟HashCodeBuilder??????public???boolean??equals(Object?o)??{
apache 中的EqualsBuilder跟HashCodeBuilder?????????boolean??equals??=???false?;
apache 中的EqualsBuilder跟HashCodeBuilder?????????if??(?o??!=???null???&&?PoliticalCandidate.?class?.isAssignableFrom(o)?)??{
apache 中的EqualsBuilder跟HashCodeBuilder????????????PoliticalCandidate?pc??=??(PoliticalCandidate)?o;
apache 中的EqualsBuilder跟HashCodeBuilder????????????equals??=??(?new??EqualsBuilder(?)
apache 中的EqualsBuilder跟HashCodeBuilder???????????????????????.append(firstName,?ps.firstName)
apache 中的EqualsBuilder跟HashCodeBuilder???????????????????????.append(lastName,?ps.lastName)).isEquals(?);
apache 中的EqualsBuilder跟HashCodeBuilder????????}?
apache 中的EqualsBuilder跟HashCodeBuilder?????????return??equals;
apache 中的EqualsBuilder跟HashCodeBuilder????}?
apache 中的EqualsBuilder跟HashCodeBuilder?
apache 中的EqualsBuilder跟HashCodeBuilder}?
apache 中的EqualsBuilder跟HashCodeBuilderDiscussion:
1.在上述例子中,当有相同的firstname和lastname时,认为两个对象的hashCode相同,从而equals()返回true.
如果hashCode取决于该class的所有filed时需要使用反射机制来产生一个hashCode。
apache 中的EqualsBuilder跟HashCodeBuilder?public???int??hashCode(?)??{
apache 中的EqualsBuilder跟HashCodeBuilder?????return??HashCodeBuilder.reflectionHashCode(?this?);
apache 中的EqualsBuilder跟HashCodeBuilder}和ToStringBuilder?与?HashCodeBuilder一样EqualsBuilder?也是使用append()方法进行配置,?EqualsBuilder的append()方法可以接受基本类型、对象、数组作为参数。EqualsBuilder强大的地方在于可以直接把数组作为参数传入append()方法,EqualsBuilder会依次比较数组中的每个元素。
2.如果两个对象相等当且仅当每个属性值都相等 这句话可以由以下代码实现:
apache 中的EqualsBuilder跟HashCodeBuilder?public???boolean??equals(Object?o)??{
apache 中的EqualsBuilder跟HashCodeBuilder?????return??EqualsBuilder.reflectionEquals(?this?,?o);
apache 中的EqualsBuilder跟HashCodeBuilder}

问题提出:需要快速实现compareTo()方法
解决方法:使用CompareToBuilder提供的compareTo()方法。同样的CompareToBuilder也使用了反射机制。以下代码提供了一个compareTo()方法,用于比较两个对象所有的非static和非transient成员变量。

apache 中的EqualsBuilder跟HashCodeBuilder?import??org.apache.commons.lang.builder.CompareToBuilder;
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder?//??Build?a?compareTo?function?from?reflection??
apache 中的EqualsBuilder跟HashCodeBuilder?public???int??compareTo(Object?o)??{
apache 中的EqualsBuilder跟HashCodeBuilder?????return??CompareToBuilder.reflectionCompare(?this?,?obj);
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder}
Discussion:?CompareToBuilder.reflectionCompare()提供了两个对象non-static和nontransient成员变量的方法。 reflectionCompare()方法不予理会static和transient变量,因此以下代码中的averageAge和fullName变量是不会进入比较表达式的。
apache 中的EqualsBuilder跟HashCodeBuilder?public???class??PoliticalCandidate??{
apache 中的EqualsBuilder跟HashCodeBuilder?????//??Static?variable?
apache 中的EqualsBuilder跟HashCodeBuilder??????private???static??String?averageAge;
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder?????//??Member?variables??
apache 中的EqualsBuilder跟HashCodeBuilder??????private??String?firstName;
apache 中的EqualsBuilder跟HashCodeBuilder?????private??String?lastName;
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder?????private???transient??String?fullName;
apache 中的EqualsBuilder跟HashCodeBuilder?????//??Constructors
apache 中的EqualsBuilder跟HashCodeBuilder?????//??get/set?methods
apache 中的EqualsBuilder跟HashCodeBuilder?????//??Build?a?compareTo?function?from?reflection??
apache 中的EqualsBuilder跟HashCodeBuilder??????public???int??compareTo(Object?o)??{
apache 中的EqualsBuilder跟HashCodeBuilder?????????return??CompareToBuilder.reflectionCompare(?this?,?obj);
apache 中的EqualsBuilder跟HashCodeBuilder????}?
apache 中的EqualsBuilder跟HashCodeBuilder?
apache 中的EqualsBuilder跟HashCodeBuilder}比较对象成员变量的时候应该有一个比较的次序存在,上述代码中默认的应该是先比较lastName,然后是firstName。调用append()方法可以把要比较的变量加入比较表达式中,并且遵循后加入的先比较的次序。
例如:
apache 中的EqualsBuilder跟HashCodeBuilder?public???int??compareTo(Object?o)??{
apache 中的EqualsBuilder跟HashCodeBuilder?????int??compare??=???-?1?;??//??By?default?return?less-than?
apache 中的EqualsBuilder跟HashCodeBuilder??????if?(?o??!=???null???&&??PoliticalCandidate.?class?.isAssignableFrom(?o.getClass(?)?)?)??{
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder????????????PoliticalCandidate?pc??=??(PoliticalCandidate)?o;
apache 中的EqualsBuilder跟HashCodeBuilder????????????compare??=??(?new??CompareToBuilder(?)
apache 中的EqualsBuilder跟HashCodeBuilder??????????????????????????.append(firstName,?pc.firstName)
apache 中的EqualsBuilder跟HashCodeBuilder??????????????????????????.append(lastName,?pc.lastName)).toComparison(?);
apache 中的EqualsBuilder跟HashCodeBuilder????}?
apache 中的EqualsBuilder跟HashCodeBuilder?
apache 中的EqualsBuilder跟HashCodeBuilder?????return??compare;
apache 中的EqualsBuilder跟HashCodeBuilder}在比较的时候会先比较lastName,只有在lastName相同的情况下才会比较firstName。
ps:实现compareTo()的时候应保证和equals()规则相同,即当compareTo()返回是0的时候equals()应该返回true。
1.1 ReflectionToStringBuilder本笔记是在阅读Jakarta Commons Cookbook时所留下的。
1.使用ReflectionToStringBuilder?或者ToStringBuilder?自动产生toString()的内容。
?? 使用举例:假设有一个表征校长候选人信息的javabean-PoliticalCandidate。
??apache 中的EqualsBuilder跟HashCodeBuilderpublic?class?PoliticalCandidate?{
apache 中的EqualsBuilder跟HashCodeBuilder????private?String?lastName;
apache 中的EqualsBuilder跟HashCodeBuilder????private?String?firstName;
apache 中的EqualsBuilder跟HashCodeBuilder????private?Date?dateOfBirth;
apache 中的EqualsBuilder跟HashCodeBuilder????private?BigDecimal?moneyRaised;
apache 中的EqualsBuilder跟HashCodeBuilder????private?State?homeState;
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder????//?get/set方法省略apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder????public?void?toString(?)?{
apache 中的EqualsBuilder跟HashCodeBuilder????????ReflectionToStringBuilder.toString(?this?);
apache 中的EqualsBuilder跟HashCodeBuilder????}
apache 中的EqualsBuilder跟HashCodeBuilder}
该bean里面有个toString()方法,假设有以下操作:
apache 中的EqualsBuilder跟HashCodeBuilder//?Create?a?State
apache 中的EqualsBuilder跟HashCodeBuilderState?va?=?new?State(?"VA",?"Virginia");
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder//?Create?a?Birth?Date
apache 中的EqualsBuilder跟HashCodeBuilderCalendar?calendar?=?new?GregorianCalendar(?);
apache 中的EqualsBuilder跟HashCodeBuildercalendar.set(?Calendar.YEAR,?1743?);
apache 中的EqualsBuilder跟HashCodeBuildercalendar.set(?Calendar.MONTH,?Calendar.APRIL?);
apache 中的EqualsBuilder跟HashCodeBuildercalendar.set(?Calendar.DAY_OF_MONTH,?13?);
apache 中的EqualsBuilder跟HashCodeBuilderDate?dob?=?calendar.getTime(?);
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilderBigDecimal?moneyRaised?=?new?BigDecimal(?293829292.93?);????????
apache 中的EqualsBuilder跟HashCodeBuilder
apache 中的EqualsBuilder跟HashCodeBuilder//?Create?a?Political?Candidate
apache 中的EqualsBuilder跟HashCodeBuilderPoliticalCandidate?candidate?=?
apache 中的EqualsBuilder跟HashCodeBuilder????new?PoliticalCandidate(?"Jefferson",?"Thomas",?dob,?moneyRaised,?va?);
apache 中的EqualsBuilder跟HashCodeBuilder?????
apache 中的EqualsBuilder跟HashCodeBuilderSystem.out.println(?candidate?);
apache 中的EqualsBuilder跟HashCodeBuilder假设State对象也是一个使用ReflectionToStringBuilder的javabean,上述程序一种可能的输出为com.discursive.jccook.lang.builders.PoliticalCandidate@187aeca
??? [lastName=Jefferson,\firstName=Thomas,
???? dateOfBirth=Sat Apr 13 22:38:42 CST 1743,
???? moneyRaised=\293829292.930000007152557373046875,
???? state=\com.discursive.jccook.lang.builders.State@87816d
???????? [abbreviation=VA,name=Virginia]]

org.apache.commons.lang.builder
  CompareToBuilder – 用于辅助实现Comparable.compareTo(Object)方法;
  
  EqualsBuilder?– 用于辅助实现Object.equals()方法;
  
  HashCodeBuilder – 用于辅助实现Object.hashCode()方法;
  
  ToStringBuilder – 用于辅助实现Object.toString()方法;
  
  ReflectionToStringBuilder – 使用反射机制辅助实现Object.toString()方法;
  
  ToStringStyle – 辅助ToStringBuilder控制输出格式;
  
  StandardToStringStyle – 辅助ToStringBuilder控制标准格式。

热点排行