當EffectiveJava遇見Guava - 使類和成員的可訪問性最小化(規(guī)則13)


          軟件設計的基本原則之一,就是系統(tǒng)要模塊化,模塊之間只通過他們的API進行通信,一個模塊不需要知道其他模塊的內部工作情況,這個概念稱作信息隱藏(information hiding)或封裝(encapsulation)。

          需要遵守的原則
          • 盡可能地使每個類或成員不被外界訪問。換句話說,應該使用與你正在編寫的軟件的對應功能相一致、盡可能最小的訪問級別。

          • 對于頂層的(非嵌套的)類和接口,只有兩種可能非訪問級別,要從是包級私有的也就是default,要么是public的.包級私有就意味著它是這個包實現(xiàn)的一部分,不會作為該包API被導出,這樣在以后的發(fā)型版本中,對它修改、替換、刪除就不用擔心會影響先有客戶端的程序。

          • 如果一個包級私有的頂層類(或者接口)只是在某一個類內部被用到,就應該考慮把它變成唯一使用它的那個類的私有嵌套類。

          • 降低不必要公有類的可訪問性,比降低包級私有的頂層類更重要的多,因為共有類是API的一部分,而包級私有的頂層類已經是包實現(xiàn)的一部分了。

          • 受保護(protected)的類或成員是導出API的一部分,必須永遠得到支持,應該避免盡量少用。

          • 如果子類覆蓋了超類的一個方法,子類中的訪問級別就不允許低于超類中的訪問級別,否則會編譯錯誤。實現(xiàn)了接口的所有方法也必須是共有的,因為接口中的所有方法都是隱含著共有訪問級別。

          • 為了便于測試,不應該把其訪問級別成為共有的,取而代之是把測試類成為包的一部分,從而能夠訪問它的包級私有元素。

          • 實例域決不能是共有的,包含公有可變域的類即便是final的也不是線程安全的

          Note
          長度非零的數(shù)組總數(shù)可變的,所以,類具有公有的靜態(tài)final數(shù)組域,或者返回這種域的訪問方法,這幾乎總數(shù)錯誤的。

          public class UnmodifiableArray {
          // 潛在安全漏洞
          public static final String[] VALUES = { "RED", "GREEN" };

          public static void main(String[] args) {
          UnmodifiableArray UF = new UnmodifiableArray();
          UF.VALUES[1] = "YELLO";//設置final數(shù)組成員
          System.out.println(UF);
          }
          //使用Guava
          @Override
          public String toString() {
          return Objects.toStringHelper(this).add("VALUES0", UnmodifiableArray.VALUES[0])
          .add("VALUES1", UnmodifiableArray.VALUES[1]).toString();
          }
          }

          上面的例子里,我們成功更改了一個不可變數(shù)組,把成員GREEN修改為YELLO,執(zhí)行輸出如下:

          UnmodifiableArray{VALUES0=RED, VALUES1=YELLO}

          我們可以通過增加一個不可變集合列表來解決這個安全問題,并把原來public訪問級別改為private的:

          public class UnmodifiableArrayList {
          // 消除安全漏洞
          private static final String[] PRIVATE_VALUES = { "RED", "GREEN" };
          public static final List<String> PVALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
          public static void main(String[] args) {
          UnmodifiableArrayList UF = new UnmodifiableArrayList();
          UF.PVALUES.add(1, "YELLO"); //會拋出UnsupportedOperationException異常
          System.out.println(UF);
          }
          //使用Guava
          @Override
          public String toString() {
          return Objects.toStringHelper(this)
          .add("PVALUES0", UnmodifiableArrayList.PVALUES.get(0))
          .add("PVALUES1", UnmodifiableArrayList.PVALUES.get(1))
          .toString();
          }
          }

          構建一個不可變集合,Guava給出了更簡潔的辦法:

          ImmutableList mmutableList = ImmutableList.of(PRIVATE_VALUES);

          2013-06-14

          posted on 2013-06-14 17:09 kuuyee 閱讀(2940) 評論(1)  編輯  收藏 所屬分類: JEE

          評論

          # re: 當EffectiveJava遇見Guava - 使類和成員的可訪問性最小化(規(guī)則13) 2014-09-15 17:41 廊坊網(wǎng)站建設

          路過下,圍觀博主高談論擴,笑看人生  回復  更多評論   

          導航

          <2013年6月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          統(tǒng)計

          隨筆分類(139)

          Linux內核

          搜索

          •  

          積分與排名

          • 積分 - 320265
          • 排名 - 178

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 宣武区| 阿合奇县| 禄丰县| 开阳县| 乐昌市| 达州市| 灯塔市| 龙山县| 尼玛县| 基隆市| 嘉兴市| 肃宁县| 溧阳市| 龙州县| 凯里市| 平昌县| 即墨市| 项城市| 宁城县| 布尔津县| 天峻县| 林州市| 红桥区| 盐津县| 苏州市| 东兰县| 阿鲁科尔沁旗| 安国市| 寻乌县| 泌阳县| 攀枝花市| 克什克腾旗| 新兴县| 剑阁县| 榕江县| 德阳市| 宣威市| 陆丰市| 长葛市| 浦城县| 绥芬河市|