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

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

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

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


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

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

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

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

    • 降低不必要公有類的可訪問性,比降低包級(jí)私有的頂層類更重要的多,因?yàn)楣灿蓄愂茿PI的一部分,而包級(jí)私有的頂層類已經(jīng)是包實(shí)現(xiàn)的一部分了。

    • 受保護(hù)(protected)的類或成員是導(dǎo)出API的一部分,必須永遠(yuǎn)得到支持,應(yīng)該避免盡量少用。

    • 如果子類覆蓋了超類的一個(gè)方法,子類中的訪問級(jí)別就不允許低于超類中的訪問級(jí)別,否則會(huì)編譯錯(cuò)誤。實(shí)現(xiàn)了接口的所有方法也必須是共有的,因?yàn)榻涌谥械乃蟹椒ǘ际请[含著共有訪問級(jí)別。

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

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

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

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

    public static void main(String[] args) {
    UnmodifiableArray UF = new UnmodifiableArray();
    UF.VALUES[1] = "YELLO";//設(shè)置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();
    }
    }

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

    UnmodifiableArray{VALUES0=RED, VALUES1=YELLO}

    我們可以通過增加一個(gè)不可變集合列表來解決這個(gè)安全問題,并把原來public訪問級(jí)別改為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"); //會(huì)拋出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();
    }
    }

    構(gòu)建一個(gè)不可變集合,Guava給出了更簡潔的辦法:

    ImmutableList mmutableList = ImmutableList.of(PRIVATE_VALUES);

    2013-06-14

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

    評(píng)論

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

    路過下,圍觀博主高談?wù)摂U(kuò),笑看人生  回復(fù)  更多評(píng)論   

    導(dǎo)航

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

    統(tǒng)計(jì)

    隨筆分類(139)

    Linux內(nèi)核

    搜索

    •  

    積分與排名

    • 積分 - 320429
    • 排名 - 178

    最新評(píng)論

    閱讀排行榜

    主站蜘蛛池模板: 亚洲精品国产美女久久久| 四虎在线免费播放| 久久久无码精品亚洲日韩软件| 国产亚洲福利在线视频| 99久久99这里只有免费费精品| 日韩精品一区二区亚洲AV观看| 免费A级毛片无码专区| 久久亚洲AV午夜福利精品一区| 国产在线精品免费aaa片| 国产乱辈通伦影片在线播放亚洲 | 国产免费内射又粗又爽密桃视频 | 亚洲精品麻豆av| 一级美国片免费看| 国内精品99亚洲免费高清| 国产一级在线免费观看| 国产亚洲成av片在线观看| 日韩中文字幕免费视频| 亚洲午夜成激人情在线影院| 国产精品久久久久免费a∨| 亚洲日韩av无码中文| 国产免费拔擦拔擦8x| 一级日本高清视频免费观看| 久久综合亚洲色HEZYO国产| 国产成人精品免费久久久久| 亚洲一区影音先锋色资源| 一个人免费高清在线观看| MM1313亚洲精品无码久久| 国产亚洲精品自在线观看| 无码国产精品一区二区免费16| 亚洲人成网站在线观看播放青青| 日本高清免费中文字幕不卡| 国产黄片不卡免费| 亚洲国产电影在线观看| 国产一级理论免费版| 免费无码黄网站在线看| 亚洲人成在线中文字幕| 亚洲国产一区二区三区| 95老司机免费福利| 免费无码专区毛片高潮喷水 | 亚洲中文字幕无码一区二区三区| 91成人免费观看|