Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          [Jakarta Commons筆記] org.apache.commons.lang.builder

          Posted on 2005-07-30 15:38 laogao 閱讀(6099) 評(píng)論(0)  編輯  收藏 所屬分類: On Java

           

          在前面的專題文章中,我們一起過了一遍org.apache.commons.lang包,接下來我們繼續(xù)看org.apache.commons.lang.builder這個(gè)包。在這里面我們可以找到7個(gè)類,用于幫助我們實(shí)現(xiàn)Java對(duì)象的一些基礎(chǔ)的共有方法。這7個(gè)類分別是:

           

          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)格式。

           

          我們知道,在實(shí)際應(yīng)用中,其實(shí)經(jīng)常需要在運(yùn)行過程中判定對(duì)象的知否相等、比較、取hash、和獲取對(duì)象基本信息(一般是產(chǎn)生log日志)。然而實(shí)現(xiàn)這些compareToequalshashCodetoString其實(shí)并非那么直截了當(dāng),甚至稍有不注意就可能造成難以追蹤的bug,而且這些方法手工維護(hù)的話,比較繁瑣,也容易出錯(cuò)。于是Commons Langbuilder這個(gè)包中提供了上述輔助類,為我們簡化這些方法的實(shí)現(xiàn)和維護(hù)。

           

          來看一個(gè)例子:

           

          package sean.study.jakarta.commons.lang;

           

          import java.util.Date;

           

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

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

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

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

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

           

          public class BuilderUsage {

           

              public static void main(String[] args) {

                 

                  Staff staff1 = new Staff(123, "John Smith", new Date());

                  Staff staff2 = new Staff(456, "Jane Smith", new Date());

                 

                  System.out.println("staff1's info: " + staff1);

                  System.out.println("staff2's info: " + staff2);

                  System.out.println("staff1's hash code: " + staff1.hashCode());

                  System.out.println("staff2's hash code: " + staff2.hashCode());

                  System.out.println("staff1 equals staff2? " + staff1.equals(staff2));

           

              }

           

          }

           

          class Staff implements Comparable {

           

              private long staffId;

              private String staffName;

              private Date dateJoined;

           

              public Staff() {

              }

           

              public Staff(long staffId, String staffName, Date dateJoined) {

                  this.staffId = staffId;

                  this.staffName = staffName;

                  this.dateJoined = dateJoined;

              }

           

              public int compareTo(Object o) {

                  int res = -1;

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

                      Staff s = (Staff) o;

                      res = new CompareToBuilder()

                              .append(dateJoined, s.getDateJoined())

                              .append(staffName, s.getStaffName()).toComparison();

                  }

                  return res;

              }

           

              public boolean equals(Object o) {

                  boolean res = false;

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

                      Staff s = (Staff) o;

                      res = new EqualsBuilder()

                              .append(staffId, s.getStaffId())

                              .isEquals();

                  }

                  return res;

              }

           

              public int hashCode() {

                  return new HashCodeBuilder(11, 23).append(staffId).toHashCode();

              }

           

              public String toString() {

                  return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

                          .append("staffId", staffId)

                          .append("staffName", staffName)

                          .append("dateJoined", dateJoined)

                          .toString();

              }

           

              public Date getDateJoined() {

                  return dateJoined;

              }

           

              public void setDateJoined(Date dateJoined) {

                  this.dateJoined = dateJoined;

              }

           

              public long getStaffId() {

                  return staffId;

              }

           

              public void setStaffId(long staffId) {

                  this.staffId = staffId;

              }

           

              public String getStaffName() {

                  return staffName;

              }

           

              public void setStaffName(String staffName) {

                  this.staffName = staffName;

              }

          }

           

          以下是運(yùn)行結(jié)果:

           

          staff1's info: sean.study.jakarta.commons.lang.Staff@190d11[

            staffId=123

            staffName=John Smith

            dateJoined=Sat Jul 30 13:18:45 CST 2005

          ]

          staff2's info: sean.study.jakarta.commons.lang.Staff@1fb8ee3[

            staffId=456

            staffName=Jane Smith

            dateJoined=Sat Jul 30 13:18:45 CST 2005

          ]

          staff1's hash code: 376

          staff2's hash code: 709

          staff1 equals staff2? false

           

          這些builder使用起來都很簡單,new一個(gè)實(shí)例,append需要參與的信息,最后加上toComparisonisEqualstoHashCodetoString這樣的結(jié)尾即可。相應(yīng)的,如果你不需要這樣級(jí)別的控制,也可以使用利用反射機(jī)制的版本自動(dòng)化實(shí)現(xiàn)需要的功能,如:

           

              public int compareTo(Object o) {

                  return CompareToBuilder.reflectionCompare(this, o);

              }

           

              public boolean equals(Object o) {

                  return EqualsBuilder.reflectionEquals(this, o);

              }

           

              public int hashCode() {

                  return HashCodeBuilder.reflectionHashCode(this);

              }

           

              public String toString() {

                  return ReflectionToStringBuilder.toString(this);

              }

           

          尤其當(dāng)我們?cè)陧?xiàng)目中不希望過多的參與到對(duì)這些對(duì)象方法的維護(hù)時(shí),采用Commons提供的利用反射的這些API就成了方便而相對(duì)安全的一個(gè)方案。

           

           

          主站蜘蛛池模板: 出国| 景洪市| 龙泉市| 金阳县| 重庆市| 达州市| 威宁| 明溪县| 瓦房店市| 什邡市| 台东市| 常熟市| 沅陵县| 浏阳市| 呼伦贝尔市| 泰兴市| 漳州市| 怀远县| 平山县| 岐山县| 正阳县| 汤原县| 绩溪县| 白沙| 綦江县| 八宿县| 会宁县| 大同县| 永昌县| 商洛市| 泰兴市| 左贡县| 永年县| 延安市| 武强县| 新干县| 新野县| 南部县| 杂多县| 屏东市| 闵行区|