日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

EqualsBuilder和HashCodeBuilder

發(fā)布時(shí)間:2024/1/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EqualsBuilder和HashCodeBuilder 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
EqualsBuilder和HashCodeBuilder

自動(dòng)化hashCode()和equals()
? 問題產(chǎn)生:當(dāng)需要自動(dòng)實(shí)現(xiàn)hashCode()和equals()方法
? 解決方法:使用EqualsBuilder和HashCodeBuilder?
? 使用舉例:
?

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

?public???class??PoliticalCandidate??
{
?????//?
?Member?variables?-?omitted?for?brevity
?????//?
?Constructors?-?omitted?for?brevity
?????//?
?get/set?methods?-?omitted?for?brevity
?????//??A?hashCode?which?creates?a?hash?from?the?two?unique?identifiers?

?
??????public???int??hashCode(?)??{
?????????return???new??HashCodeBuilder(?17?,??37?
)
???????????????????????.append(firstName)
???????????????????????.append(lastName).toHashCode(?);
????}
?
?
????
?//??An?equals?which?compares?two?unique?identifiers?
??????public???boolean??equals(Object?o)??{
?????????boolean??equals??=???false?
;
?????????if??(?o??!=???null???&&?PoliticalCandidate.?class?.isAssignableFrom(o)?)??
{
????????????PoliticalCandidate?pc??=?
?(PoliticalCandidate)?o;
????????????equals??=??(?new?
?EqualsBuilder(?)
???????????????????????.append(firstName,?ps.firstName)
???????????????????????.append(lastName,?ps.lastName)).isEquals(?);
????????}
?
?????????return??equals;
????}
?
?
}
?

Discussion:
1.在上述例子中,當(dāng)有相同的firstname和lastname時(shí),認(rèn)為兩個(gè)對(duì)象的hashCode相同,從而equals()返回true.
如果hashCode取決于該class的所有filed時(shí)需要使用反射機(jī)制來產(chǎn)生一個(gè)hashCode。

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

和ToStringBuilder?與?HashCodeBuilder一樣EqualsBuilder?也是使用append()方法進(jìn)行配置,?EqualsBuilder的append()方法可以接受基本類型、對(duì)象、數(shù)組作為參數(shù)。EqualsBuilder強(qiáng)大的地方在于可以直接把數(shù)組作為參數(shù)傳入append()方法,EqualsBuilder會(huì)依次比較數(shù)組中的每個(gè)元素。
2.如果兩個(gè)對(duì)象相等當(dāng)且僅當(dāng)每個(gè)屬性值都相等 這句話可以由以下代碼實(shí)現(xiàn):

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

問題提出:需要快速實(shí)現(xiàn)compareTo()方法
解決方法:使用CompareToBuilder提供的compareTo()方法。同樣的CompareToBuilder也使用了反射機(jī)制。以下代碼提供了一個(gè)compareTo()方法,用于比較兩個(gè)對(duì)象所有的非static和非transient成員變量。

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

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

}


Discussion:?CompareToBuilder.reflectionCompare()提供了兩個(gè)對(duì)象non-static和nontransient成員變量的方法。 reflectionCompare()方法不予理會(huì)static和transient變量,因此以下代碼中的averageAge和fullName變量是不會(huì)進(jìn)入比較表達(dá)式的。

?public???class??PoliticalCandidate??{
?????//??Static?variable?

??????private???static??String?averageAge;

?????//??Member?variables??

??????private??String?firstName;
?????private?
?String?lastName;

?????private???transient?
?String?fullName;
?????//?
?Constructors
?????//?
?get/set?methods
?????//??Build?a?compareTo?function?from?reflection??

??????public???int??compareTo(Object?o)??{
?????????return??CompareToBuilder.reflectionCompare(?this?
,?obj);
????}
?
?
}

比較對(duì)象成員變量的時(shí)候應(yīng)該有一個(gè)比較的次序存在,上述代碼中默認(rèn)的應(yīng)該是先比較lastName,然后是firstName。調(diào)用append()方法可以把要比較的變量加入比較表達(dá)式中,并且遵循后加入的先比較的次序。
例如:

?public???int??compareTo(Object?o)??{
?????int??compare??=???-?1?;??//??By?default?return?less-than?

??????if?(?o??!=???null???&&??PoliticalCandidate.?class?.isAssignableFrom(?o.getClass(?)?)?)??{

????????????PoliticalCandidate?pc??=?
?(PoliticalCandidate)?o;
????????????compare??=??(?new?
?CompareToBuilder(?)
??????????????????????????.append(firstName,?pc.firstName)
??????????????????????????.append(lastName,?pc.lastName)).toComparison(?);
????}
?
?
????
?return??compare;
}

在比較的時(shí)候會(huì)先比較lastName,只有在lastName相同的情況下才會(huì)比較firstName。
ps:實(shí)現(xiàn)compareTo()的時(shí)候應(yīng)保證和equals()規(guī)則相同,即當(dāng)compareTo()返回是0的時(shí)候equals()應(yīng)該返回true。

1.1 ReflectionToStringBuilder

本筆記是在閱讀Jakarta Commons Cookbook時(shí)所留下的。
1.使用ReflectionToStringBuilder?或者ToStringBuilder?自動(dòng)產(chǎn)生toString()的內(nèi)容。
?? 使用舉例:假設(shè)有一個(gè)表征校長(zhǎng)候選人信息的javabean-PoliticalCandidate。
??
public?class?PoliticalCandidate?{
????private?String?lastName;
????private?String?firstName;
????private?Date?dateOfBirth;
????private?BigDecimal?moneyRaised;
????private?State?homeState;

????//?get/set方法省略
????public?void?toString(?)?{
????????ReflectionToStringBuilder.toString(?this?);
????}
}

該bean里面有個(gè)toString()方法,假設(shè)有以下操作:
//?Create?a?State
State?va?=?new?State(?"VA",?"Virginia");

//?Create?a?Birth?Date
Calendar?calendar?=?new?GregorianCalendar(?);
calendar.set(?Calendar.YEAR,?1743?);
calendar.set(?Calendar.MONTH,?Calendar.APRIL?);
calendar.set(?Calendar.DAY_OF_MONTH,?13?);
Date?dob?=?calendar.getTime(?);

BigDecimal?moneyRaised?=?new?BigDecimal(?293829292.93?);????????

//?Create?a?Political?Candidate
PoliticalCandidate?candidate?=?
????new?PoliticalCandidate(?"Jefferson",?"Thomas",?dob,?moneyRaised,?va?);
?????
System.out.println(?candidate?);
假設(shè)State對(duì)象也是一個(gè)使用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 – 用于輔助實(shí)現(xiàn)Comparable.compareTo(Object)方法;
  
  EqualsBuilder?– 用于輔助實(shí)現(xiàn)Object.equals()方法;
  
  HashCodeBuilder – 用于輔助實(shí)現(xiàn)Object.hashCode()方法;
  
  ToStringBuilder – 用于輔助實(shí)現(xiàn)Object.toString()方法;
  
  ReflectionToStringBuilder – 使用反射機(jī)制輔助實(shí)現(xiàn)Object.toString()方法;
  
  ToStringStyle – 輔助ToStringBuilder控制輸出格式;
  
  StandardToStringStyle – 輔助ToStringBuilder控制標(biāo)準(zhǔn)格式。

轉(zhuǎn)載于:https://www.cnblogs.com/cglWorkBook/p/4788779.html

總結(jié)

以上是生活随笔為你收集整理的EqualsBuilder和HashCodeBuilder的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。