EffectiveJava第4章-類和接口

第13條:使類和成員的可訪問(wèn)性最小化

這個(gè)被稱為信息隱藏或封裝与柑。它可以解耦流炕,使模塊可以獨(dú)立開(kāi)發(fā)、測(cè)試仅胞、優(yōu)化每辟、使用、理解和修改干旧∏郏可以讓開(kāi)發(fā)人員單獨(dú)調(diào)試自己的程序,提高開(kāi)發(fā)系統(tǒng)的速度椎眯,程序有問(wèn)題的時(shí)候挠将,可以準(zhǔn)確的定位在哪個(gè)模塊出現(xiàn)問(wèn)題,降低了構(gòu)建大型系統(tǒng)的風(fēng)險(xiǎn)编整。

訪問(wèn)控制機(jī)制決定了類舔稀、接口和成員的可訪問(wèn)性。
第一個(gè)規(guī)則:盡可能地使每個(gè)類或者成員不被外界訪問(wèn)掌测。類和接口只有兩種訪問(wèn)級(jí)別:包級(jí)私有(private)和公有的(public)内贮。

對(duì)于成員(域、方法汞斧、嵌套類和嵌套接口)有四種可能的訪問(wèn)級(jí)別夜郁,按訪問(wèn)性遞增順序羅列:

  1. 私有的(private),只有在聲明該成員的頂層類內(nèi)部才可以訪問(wèn)這個(gè)成員粘勒。
  2. 包級(jí)私有的(package-private)竞端,聲明改成員的包內(nèi)部的任何類都可以訪問(wèn)這個(gè)成員。從技術(shù)上講庙睡,它被稱為“缺适赂弧(default)訪問(wèn)級(jí)別”,如果沒(méi)有為成員指定訪問(wèn)修飾符乘陪,就采用這個(gè)訪問(wèn)級(jí)別统台。
  3. 受保護(hù)的(protected),聲明該成員的類的子類可以訪問(wèn)這個(gè)成員暂刘,并且饺谬,聲明該成員的包內(nèi)部的任何類也可以訪問(wèn)這個(gè)成員。
  4. 公有的(public),在任何地方都可以訪問(wèn)該成員募寨。

如果方法覆蓋了超類的一個(gè)方法族展,子類中的訪問(wèn)級(jí)別就不允許低于超類中的訪問(wèn)級(jí)別。這樣可以確保任何使用超類的實(shí)例的地方都可以使用子類的實(shí)例拔鹰。
接口中的方法默認(rèn)就是共有的仪缸,所以一個(gè)類實(shí)現(xiàn)了一個(gè)接口,那么接口中所有的類方法在這個(gè)類中也都必須聲明為公有的列肢。

實(shí)例域絕對(duì)不能是公有的(第14條:在公有類中使用訪問(wèn)方法而非公有域)恰画。

長(zhǎng)度非零的數(shù)組總是可變的,

public static final String[] VALUES = {};  
    //公有數(shù)組變成私有的瓷马,并增加一個(gè)公有的不可變列表
    private static final String[] VALUES = {...};
    public static final List<Thing> VALUES =               Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
    //或者返回私有數(shù)組的克隆
    private static final String[] VALUES = {...};
    public static final Thing[] values(){
        return PRIVATE_VALUES.clone();
    }
}

第14條:在公有類中使用訪問(wèn)方法而非公有域

如果類可以在它所在的包的外部進(jìn)行訪問(wèn)拴还,就提供訪問(wèn)方法,以保留將來(lái)改變?cè)擃惖膬?nèi)部表示法的靈活性欧聘。

如果類是包級(jí)私有的片林,或者私有的嵌套類,直接暴露它的數(shù)據(jù)域并沒(méi)有本質(zhì)的錯(cuò)誤怀骤。

第15條:使可變性最小化

不可變類只是其實(shí)例不能被修改的類费封,例如String,基本類型的包裝類蒋伦、BigInteger和BigDecimal弓摘。不可變的類比可變的類更加易于設(shè)計(jì)、實(shí)現(xiàn)和使用痕届。它們不容易出錯(cuò)韧献,且更加安全。

要使類成為不可變爷抓,要遵守下面五條規(guī)則:

 1. 不要提供任何會(huì)修改對(duì)象狀態(tài)的方法势决。

 2. 保證類不會(huì)被擴(kuò)展。一般是把類定義為final的蓝撇,或者將類的所有構(gòu)造器都變成私有的或者是包級(jí)私有的,并添加靜態(tài)工廠來(lái)代替共有的構(gòu)造器陈莽。

 3. 使所有的域都是final的渤昌。

 4. 使所有的域都成為私有的。

 5. 確保對(duì)于任何可變組件的互斥訪問(wèn)走搁。確倍栏蹋客戶端無(wú)法獲得對(duì)象的引用。

不可變對(duì)象本質(zhì)上是線程安全的私植,它們不要求同步忌栅。

不可變對(duì)象可以被自由地共享,不僅可以共享不可變對(duì)象,甚至也可以共享它們的內(nèi)部信息索绪。

不可變對(duì)象為其他對(duì)象提供了大量的構(gòu)件

不可變對(duì)象真正唯一的缺點(diǎn)是湖员,對(duì)于每個(gè)不同的值都需要一個(gè)單獨(dú)的對(duì)象。

不可變的對(duì)象內(nèi)部可以擁有一個(gè)或者多個(gè)非final得域瑞驱,來(lái)緩存一些值(hashcode,String中就有)娘摔,不變形保證了這個(gè)值永遠(yuǎn)都不會(huì)變。
基本類型的域不能用final唤反,因?yàn)樵诔跏蓟臅r(shí)候凳寺,會(huì)被賦初始值。

第16條:復(fù)合優(yōu)先于繼承

本書使用的繼承指的是實(shí)現(xiàn)繼承彤侍,即一個(gè)類擴(kuò)展另一個(gè)類的時(shí)候肠缨。

繼承打破了封裝性。子類依賴超類的特定功能的實(shí)現(xiàn)盏阶,如果超類發(fā)生變化晒奕,子類必須跟著超類一起改變。這樣的子類是非常脆弱的般哼。

只有當(dāng)子類和超類之間確實(shí)存在子類型關(guān)系時(shí)(is-a)吴汪,使用繼承才是恰當(dāng)?shù)摹?/p>

第17條:要么為繼承而設(shè)計(jì),并提供文檔說(shuō)明蒸眠,要么就禁止繼承

文檔必須精確地描述覆蓋每個(gè)方法所帶來(lái)的影響漾橙。

對(duì)于每個(gè)公有的或者受保護(hù)的方法或者構(gòu)造器,它的文檔必須指明該方法或者構(gòu)造器調(diào)用了哪些可覆蓋的方法楞卡,是以什么順序調(diào)用的霜运,每個(gè)調(diào)用的結(jié)果又是如何影響后續(xù)的處理過(guò)程的。

好的API文檔應(yīng)該描述一個(gè)給定的方法做了什么工作蒋腮,而不是描述它是如何做到的淘捡。

為了繼承而設(shè)計(jì)的類,唯一的測(cè)試方法就是編寫子類池摧。

為了允許繼承焦除,類還必須遵守其他一些約束:
1.構(gòu)造器不能調(diào)用可被覆蓋的方法
2.如果為了繼承而設(shè)計(jì)的類實(shí)現(xiàn)了Cloneable或者Serializable接口,clone和readObject都不可以調(diào)用可覆蓋的方法作彤,不管是以直接還是間接的方式膘魄。
3.如果為了繼承而設(shè)計(jì)的類實(shí)現(xiàn)了Serializable接口,并且該類有一個(gè)readResolve或者writeReplace方法竭讳,就必須使readResolve或者writeReplace成為受保護(hù)的方法创葡,而不是私有的方法。

消除類中可覆蓋方法的自用特性绢慢。就可以安全的子類化灿渴。

第18條:接口優(yōu)于抽象類

1.現(xiàn)有的類可以很容易被更新,以實(shí)現(xiàn)新的接口。比如Comparable
2.接口是定義混合類型的理想選擇骚露〉偶罚混合類型表明具有某個(gè)可供選擇的行為。
3.接口允許我們構(gòu)造非層次結(jié)構(gòu)的類型框架荸百。

骨架實(shí)現(xiàn)類就是一個(gè)抽象類繼承了某一個(gè)接口

第19條:接口只用于定義類型

常量接口:沒(méi)有包含任何方法闻伶,只包含了一些靜態(tài)的final域,每個(gè)域都導(dǎo)出一個(gè)常量够话。常量模式是對(duì)接口的不良使用

如果要導(dǎo)出常量蓝翰,就應(yīng)該把這些常量添加到這個(gè)類。
使用枚舉類型或者不可實(shí)例化的工具類女嘲。

第20條:類層次優(yōu)于標(biāo)簽類

類層次可以反映類型之間本質(zhì)上的層次關(guān)系畜份。

第21條:用函數(shù)對(duì)象表示策略

函數(shù)指針的只要用途就是實(shí)現(xiàn)策略模式。
在java中實(shí)現(xiàn)這種模式欣尼,首先要聲明一個(gè)接口來(lái)表示該策略爆雹,并且為每個(gè)具體策略聲明一個(gè)實(shí)現(xiàn)了該接口的類。當(dāng)一個(gè)具體策略只被調(diào)用一次的時(shí)候愕鼓,通常使用匿名類來(lái)聲明和實(shí)例化這個(gè)具體的實(shí)現(xiàn)類钙态。當(dāng)一個(gè)具體策略是設(shè)計(jì)用來(lái)重復(fù)使用的時(shí)候,它的類通常就要被實(shí)現(xiàn)為私有的靜態(tài)成員類菇晃,并通過(guò)公有的靜態(tài)final域被導(dǎo)出册倒,其類型為該策略接口。

第22條:優(yōu)先考慮靜態(tài)成員類

見(jiàn)另一篇文章《Java嵌套類》磺送。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驻子,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子估灿,更是在濱河造成了極大的恐慌崇呵,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馅袁,死亡現(xiàn)場(chǎng)離奇詭異域慷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汗销,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門芒粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人大溜,你說(shuō)我怎么就攤上這事」来啵” “怎么了钦奋?”我有些...
    開(kāi)封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我付材,道長(zhǎng)朦拖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任厌衔,我火速辦了婚禮璧帝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘富寿。我一直安慰自己睬隶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布页徐。 她就那樣靜靜地躺著苏潜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪变勇。 梳的紋絲不亂的頭發(fā)上恤左,一...
    開(kāi)封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音搀绣,去河邊找鬼飞袋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛链患,可吹牛的內(nèi)容都是我干的巧鸭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锣险,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蹄皱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芯肤,我...
    開(kāi)封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巷折,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后崖咨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锻拘,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年击蹲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了署拟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歌豺,死狀恐怖推穷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情类咧,我是刑警寧澤馒铃,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布蟹腾,位于F島的核電站,受9級(jí)特大地震影響区宇,放射性物質(zhì)發(fā)生泄漏娃殖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一议谷、第九天 我趴在偏房一處隱蔽的房頂上張望炉爆。 院中可真熱鬧,春花似錦卧晓、人聲如沸芬首。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衩辟。三九已至,卻和暖如春波附,著一層夾襖步出監(jiān)牢的瞬間艺晴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工掸屡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留封寞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓仅财,卻偏偏與公主長(zhǎng)得像狈究,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盏求,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 第4章 類和接口 類和接口是Java程序設(shè)計(jì)語(yǔ)言的核心抖锥,它們也是Java語(yǔ)言的基本抽象單元。 初學(xué)Java的時(shí)候感...
    程序亦非猿閱讀 839評(píng)論 4 13
  • 類與接口是Java語(yǔ)言的核心,設(shè)計(jì)出更加有用荆烈、健壯和靈活的類與接口很重要拯勉。 13、使類和成員的可訪問(wèn)性最小化 設(shè)計(jì)...
    Alent閱讀 677評(píng)論 0 2
  • 1.使類和成員的可訪問(wèn)性最小化 訪問(wèn)修飾符: private protected public 頂層的(非嵌套)類...
    666真666閱讀 840評(píng)論 0 1
  • 類和接口 一憔购、使類和成員的可訪問(wèn)性最小化 首先我們要了解一個(gè) 軟件設(shè)計(jì)基本原則:封裝 模塊隱藏所有的實(shí)現(xiàn)細(xì)節(jié)宫峦,只通...
    dooze閱讀 490評(píng)論 0 0
  • 曾經(jīng)有無(wú)數(shù)的人和書籍說(shuō)過(guò)溝通是一門技巧,但只有真正在溝通上吃過(guò)虧的人玫鸟,才會(huì)對(duì)這句話有深切感受导绷。真正可怕的事情是,你...
    簡(jiǎn)安Tina閱讀 297評(píng)論 0 1