<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    【永恒的瞬間】
    ?Give me hapy ?
    自動化hashCode()和equals()
    ? 問題產生:當需要自動實現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.在上述例子中,當有相同的firstname和lastname時,認為兩個對象的hashCode相同,從而equals()返回true.
    如果hashCode取決于該class的所有filed時需要使用反射機制來產生一個hashCode。
    public ? int ?hashCode(?)? {
    ????
    return ?HashCodeBuilder.reflectionHashCode( this
    );
    }
    和ToStringBuilder?與 HashCodeBuilder一樣EqualsBuilder 也是使用append()方法進行配置, EqualsBuilder的append()方法可以接受基本類型、對象、數組作為參數。EqualsBuilder強大的地方在于可以直接把數組作為參數傳入append()方法,EqualsBuilder會依次比較數組中的每個元素。
    2.如果兩個對象相等當且僅當每個屬性值都相等 這句話可以由以下代碼實現:
    public ? boolean ?equals(Object?o)? {
    ????
    return ?EqualsBuilder.reflectionEquals( this
    ,?o);
    }

    問題提出:需要快速實現compareTo()方法
    解決方法:使用CompareToBuilder提供的compareTo()方法。同樣的CompareToBuilder也使用了反射機制。以下代碼提供了一個compareTo()方法,用于比較兩個對象所有的非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()提供了兩個對象non-static和nontransient成員變量的方法。 reflectionCompare()方法不予理會static和transient變量,因此以下代碼中的averageAge和fullName變量是不會進入比較表達式的。
    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);
    ????}


    }
    比較對象成員變量的時候應該有一個比較的次序存在,上述代碼中默認的應該是先比較lastName,然后是firstName。調用append()方法可以把要比較的變量加入比較表達式中,并且遵循后加入的先比較的次序。
    例如:
    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;
    }
    在比較的時候會先比較lastName,只有在lastName相同的情況下才會比較firstName。
    ps:實現compareTo()的時候應保證和equals()規則相同,即當compareTo()返回是0的時候equals()應該返回true。

    1.1 ReflectionToStringBuilder

    本筆記是在閱讀Jakarta Commons Cookbook時所留下的。
    1.使用ReflectionToStringBuilder 或者ToStringBuilder 自動產生toString()的內容。
    ?? 使用舉例:假設有一個表征校長候選人信息的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里面有個toString()方法,假設有以下操作:
    //?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?);
    假設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控制標準格式。
    posted on 2007-01-23 09:07 ???MengChuChen 閱讀(8065) 評論(0)  編輯  收藏 所屬分類: JavaBasic
    主站蜘蛛池模板: 美女视频黄频a免费大全视频| 亚洲狠狠婷婷综合久久久久| 久久久久亚洲AV无码麻豆| 日日狠狠久久偷偷色综合免费| 无码少妇一区二区浪潮免费| 亚洲午夜电影在线观看高清 | 国产精品亚洲专区一区| 免费无码又爽又刺激高潮的视频| 国产精品亚洲专区在线观看| 成年人在线免费看视频| 亚洲6080yy久久无码产自国产| 免费jjzz在线播放国产| 国产99久久久国产精免费| 亚洲色精品vr一区二区三区| 97在线免费视频| 亚洲国产精品第一区二区| 99久久精品免费精品国产| 亚洲男女性高爱潮网站| 搡女人免费视频大全| www亚洲精品久久久乳| 久久精品夜色噜噜亚洲A∨| 男女午夜24式免费视频| 亚洲手机中文字幕| 破了亲妺妺的处免费视频国产| 特级毛片aaaa级毛片免费| 亚洲国产精品VA在线看黑人 | 一级毛片直播亚洲| a级片免费在线播放| 7777久久亚洲中文字幕蜜桃| 在线观看免费成人| 国产特黄特色的大片观看免费视频| 国产亚洲人成无码网在线观看| 国产香蕉免费精品视频| 国产天堂亚洲国产碰碰| 国产国拍亚洲精品mv在线观看| 国内精品乱码卡1卡2卡3免费| 男男黄GAY片免费网站WWW| 亚洲国产精品免费视频| 暖暖免费高清日本中文| 亚洲高清免费视频| 亚洲AV无码国产精品色|