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

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


          網站導航:
           
          主站蜘蛛池模板: 宝山区| 咸阳市| 蚌埠市| 佛山市| 郧西县| 祁东县| 衢州市| 吐鲁番市| 安溪县| 二连浩特市| 修文县| 云梦县| 电白县| 临沧市| 阿合奇县| 抚顺县| 铜鼓县| 舟曲县| 南华县| 揭阳市| 泗阳县| 茌平县| 广平县| 怀来县| 道孚县| 常熟市| 巨鹿县| 临桂县| 涿鹿县| 紫金县| 大化| 诸暨市| 合江县| 赤峰市| 萨嘎县| 曲阳县| 塘沽区| 额济纳旗| 湖口县| 甘孜| 芜湖县|