DANCE WITH JAVA

          開發(fā)出高質量的系統

          常用鏈接

          統計

          積分與排名

          好友之家

          最新評論

          Effective Java 23-26

          二十三、在函數的開始檢查參數的有效性
          如果函數對參數有要求,例如不接受Null ,不接受負數等等,應該盡可能在函數的最開始給出校驗,如果發(fā)現錯誤拋出異常
          二十四、在需要的時候使用保護性拷貝
          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,對于參數類型,優(yōu)先使用接口,而不是類。
          原因:如果使用接口,你可以隨意的替換實現,或者同時存在多個實現。
          使用類沒有這個優(yōu)勢。
          5,謹慎的使用函數對象(一個類中一堆靜態(tài)函數)
          二十六、謹慎的使用重載
          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
          這個程序的行為是違反直覺的,對弈重載方法的選擇是靜態(tài)的,而對于被改寫的方法的選擇是動態(tài)的
          (這個可以參考我的另一篇文章)
          2,盡量不要使用兩個參數數目相同的重載方法
          如以下兩個重載函數:
          test1(String name,String value)
          test1(String name,String[] value)
          當你調用test1("name",null)的時候就出錯了。

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

          主站蜘蛛池模板: 瑞昌市| 南皮县| 尉氏县| 湘阴县| 房产| 灵山县| 石泉县| 库车县| 蒙山县| 沾益县| 天气| 达尔| 象州县| 绥宁县| 肥城市| 扶沟县| 原平市| 花莲县| 越西县| 武城县| 乌海市| 双牌县| 定州市| 忻城县| 镇巴县| 桐城市| 大渡口区| 新干县| 囊谦县| 台北市| 慈溪市| 东明县| 通山县| 富顺县| 理塘县| 惠水县| 泸水县| 临高县| 将乐县| 昌图县| 安国市|