posts - 1, comments - 0, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          [導入]Effective Java 23-26

          Posted on 2007-02-11 00:29 江海魚 閱讀(73) 評論(0)  編輯  收藏
          二十三、在函數的開始檢查參數的有效性
          如果函數對參數有要求,例如不接受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,盡量不要使用兩個參數數目相同的重載方法

          dreamstone 2007-02-11 00:29 發表評論

          文章來源:http://www.aygfsteel.com/dreamstone/archive/2007/02/11/99199.html

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 克东县| 仙居县| 宣威市| 青神县| 克东县| 大港区| 兴海县| 磐安县| 麟游县| 许昌县| 永仁县| 平罗县| 新余市| 嘉祥县| 长白| 长治县| 桦甸市| 如皋市| 时尚| 科尔| 连云港市| 灵川县| 枣庄市| 乐陵市| 海城市| 西城区| 株洲市| 兴山县| 阿荣旗| 商洛市| 临清市| 伊春市| 玉树县| 太和县| 长顺县| 镇安县| 乌审旗| 淮南市| 花垣县| 曲水县| 海兴县|