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

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

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

    DANCE WITH JAVA

    開發出高質量的系統

    常用鏈接

    統計

    積分與排名

    好友之家

    最新評論

    Effective Java 23-26

    二十三、在函數的開始檢查參數的有效性
    如果函數對參數有要求,例如不接受Null ,不接受負數等等,應該盡可能在函數的最開始給出校驗,如果發現錯誤拋出異常
    二十四、在需要的時候使用保護性拷貝
    1,假設類的客戶會盡一切手段來破壞這個類的約束條件,在這樣的前提下,你必須保護性的設計程序。
    2,實例
    import?java.util.Date;

    public?final?class?Period?{
    ????
    private?final?Date?start;
    ????
    private?final?Date?end;
    ????
    public?Period(Date?start,Date?end){
    ????????
    if?(start.compareTo(end)>0){
    ????????????
    throw?new?IllegalArgumentException(start+"after"+end);
    ????????}

    ????????
    this.start?=?start;
    ????????
    this.end?=?end;
    ????}

    ????
    //.other?code
    }

    //這個函數看似沒有問題,實際上存在著漏洞,如下使用方法
    Date?start?=?new?Date();
    Date?end?
    =?new?Date();
    Period?p?
    =?new?Period(start,end);
    //如果加上這句,檢驗就失效了。
    end.setYear(78);

    //為了對應這個問題,更改構造函數:

    public?Period(Date?start,Date?end){
    ????
    this.start?=?new?Date(start.getTime());
    ????
    this.end?=?new?Date(end.getTime());
    ????
    if?(start.compareTo(end)>0){
    ????????
    throw?new?IllegalArgumentException(start+"after"+end);
    ????}

    }
    注意,拷貝要在檢驗之前進行
    3,參數類型可以被不可信任方子類化的情形,清不要使用clone方法進行參數的保護化拷貝
    二十五、謹慎的設計方法的原型
    1,謹慎的選擇方法的名字,一個好的方法名字可以讓人很快記住
    2,不要過于追求提供便利的方法,如果方法太多會增加使用者的學習負擔,只有當一個操作被頻繁使用的時候再添加一個對應的方法。
    3,避免太長的參數列表,盡量讓你的參數不大于三個
    4,對于參數類型,優先使用接口,而不是類。
    原因:如果使用接口,你可以隨意的替換實現,或者同時存在多個實現。
    使用類沒有這個優勢。
    5,謹慎的使用函數對象(一個類中一堆靜態函數)
    二十六、謹慎的使用重載
    1,實例
    import?java.util.ArrayList;
    import?java.util.Collection;
    import?java.util.HashMap;
    import?java.util.HashSet;
    import?java.util.List;
    import?java.util.Set;


    public?class?CollectionClassifier?{
    ????
    public?static?String?classify(Set?s){
    ????????
    return?"Set";
    ????}

    ????
    public?static?String?classify(List?s){
    ????????
    return?"List";
    ????}

    ????
    public?static?String?classify(Collection?s){
    ????????
    return?"Unknow?Collection";
    ????}

    ????
    ????
    public?static?void?main(String[]?args)?{
    ????????Collection[]?tests?
    =?new?Collection[]{
    ????????????
    new?HashSet(),
    ????????????
    new?ArrayList(),
    ????????????
    new?HashMap().values()
    ????????}
    ;
    ????????
    for(int?i=0;i<tests.length;i++){
    ????????????System.out.println(classify(tests[i]));
    ????????}

    ????}

    }
    結果是打印出三個unknown
    這個程序的行為是違反直覺的,對弈重載方法的選擇是靜態的,而對于被改寫的方法的選擇是動態的
    (這個可以參考我的另一篇文章)
    2,盡量不要使用兩個參數數目相同的重載方法
    如以下兩個重載函數:
    test1(String name,String value)
    test1(String name,String[] value)
    當你調用test1("name",null)的時候就出錯了。

    posted on 2007-02-11 00:29 dreamstone 閱讀(1278) 評論(0)  編輯  收藏 所屬分類: jdk相關

    主站蜘蛛池模板: 亚洲成?v人片天堂网无码| 又黄又爽一线毛片免费观看| 91亚洲精品麻豆| 国产青草视频在线观看免费影院| 一区二区免费在线观看| 亚洲av午夜成人片精品网站| 无码视频免费一区二三区| 日亚毛片免费乱码不卡一区| 亚洲国产精品婷婷久久| 国产zzjjzzjj视频全免费| 91短视频在线免费观看| 国产亚洲视频在线观看| 毛片免费在线视频| 精品乱子伦一区二区三区高清免费播放| 亚洲av激情无码专区在线播放| 日本免费人成黄页网观看视频| 久久综合九色综合97免费下载| 欧美亚洲精品一区二区| 精品国产免费观看一区| AAAAA级少妇高潮大片免费看 | jzzjzz免费观看大片免费| 亚洲av无码专区国产乱码在线观看| 成人免费a级毛片| 精品四虎免费观看国产高清午夜| 亚洲精品无码av天堂| 国产精品免费网站| 成人av片无码免费天天看| 亚洲欧美日韩中文字幕一区二区三区 | 0588影视手机免费看片| 一区二区3区免费视频| jiz zz在亚洲| 久久久亚洲欧洲日产国码是AV| 亚洲爽爽一区二区三区| 日本特黄a级高清免费大片| 美丽的姑娘免费观看在线播放| 亚洲精品国产福利片| 亚洲综合色视频在线观看| 精品免费国产一区二区| 美女视频黄免费亚洲| 亚洲国产成人久久精品软件| 亚洲一二成人精品区|