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

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

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

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


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

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

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

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

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

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

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

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

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

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

    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數組成員
    System.out.println(UF);
    }
    //使用Guava
    @Override
    public String toString() {
    return Objects.toStringHelper(this).add("VALUES0", UnmodifiableArray.VALUES[0])
    .add("VALUES1", UnmodifiableArray.VALUES[1]).toString();
    }
    }

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

    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 閱讀(2933) 評論(1)  編輯  收藏 所屬分類: JEE

    評論

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

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

    導航

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

    統計

    隨筆分類(139)

    Linux內核

    搜索

    •  

    積分與排名

    • 積分 - 319465
    • 排名 - 177

    最新評論

    閱讀排行榜

    主站蜘蛛池模板: 久9这里精品免费视频| 色欲aⅴ亚洲情无码AV蜜桃| 日韩高清在线免费看| 亚洲黄色网址大全| 四虎国产成人永久精品免费 | 日本在线免费观看| 亚洲无av在线中文字幕| 久久久久免费视频| 国产精品国产亚洲精品看不卡| 一区二区在线视频免费观看| 日韩精品久久久久久免费| 亚洲国产成人久久精品影视| 日韩精品人妻系列无码专区免费 | 亚洲韩国在线一卡二卡| 久久国产色AV免费看| 亚洲第一页在线播放| 天天看免费高清影视| 国产亚洲美女精品久久| 精品亚洲成α人无码成α在线观看| 中国毛片免费观看| 99ri精品国产亚洲| 成人免费AA片在线观看| 怡红院亚洲红怡院在线观看| 不卡精品国产_亚洲人成在线| 精品成人免费自拍视频| 亚洲一区中文字幕在线观看| 蜜桃精品免费久久久久影院| 免费的黄网站男人的天堂| 亚洲成色在线综合网站| 中国在线观看免费高清完整版| 国产偷国产偷亚洲高清人| 亚洲精品中文字幕乱码三区| 亚洲成a∧人片在线观看无码| 亚洲区日韩区无码区| 亚洲免费视频在线观看| 久久亚洲中文字幕无码| 国产AV无码专区亚洲Av| 成人免费网站在线观看| a视频免费在线观看| 亚洲成a人片在线观看天堂无码| 亚洲无码在线播放|