第一條:使類和成員的可訪問(wèn)性最小一個(gè)設(shè)計(jì)良好的模塊,最重要的一點(diǎn)是要對(duì)于外部模塊隱藏關(guān)鍵的實(shí)現(xiàn)細(xì)節(jié),只外漏該外拋的方法。模塊之間只通過(guò)它們之間的API進(jìn)行通訊訪問(wèn)。在Java的程序設(shè)計(jì)語(yǔ)言中,通過(guò)訪問(wèn)控制來(lái)實(shí)現(xiàn)類、接口和成員的可訪問(wèn)性限制,這些修飾符有public、protected和private。類和接口的修飾符只能是public或默認(rèn) 對(duì)于頂層接口設(shè)計(jì),只有兩種可訪問(wèn)的級(jí)別:包級(jí)私有和公有的。如果用public修飾符聲明了頂層類或接口,則它是公有訪問(wèn)級(jí)別的。否則是包級(jí)私有的。如果類或接口能做成包級(jí)私有,就應(yīng)該做成包級(jí)私有,這樣發(fā)布的版本客戶就不會(huì)影響客戶端的操作。 如果一個(gè)包級(jí)私有的頂層類只在某個(gè)類中內(nèi)部使用,可以考慮把它設(shè)計(jì)未嵌套內(nèi)部類。對(duì)于成員(域、方法、嵌套類和嵌套接口)有四中可能的訪問(wèn)級(jí)別:
第二條:在共有類中使用訪問(wèn)方法來(lái)替代公有域由于這種類的數(shù)據(jù)可以被直接訪問(wèn),這些類沒(méi)有提供封裝功能,所以如果沒(méi)有改變API接口,就無(wú)法改變它的數(shù)據(jù)行為,一般我們的建議是如果類可以在它所在的包外被訪問(wèn),就應(yīng)該主動(dòng)提供訪問(wèn)的方法來(lái)訪問(wèn)。 第三條:使可變性最小化不可變類只是實(shí)例不能被修改的類,每個(gè)實(shí)例中包含的字段信息都應(yīng)該在實(shí)例創(chuàng)建的時(shí)候進(jìn)行指定,比如String。不可變類更加易于設(shè)計(jì)、實(shí)現(xiàn)和使用,不容易出錯(cuò)。為了使類成為不可變類,一般遵循下面五條規(guī)則:
第四條:組合優(yōu)先于繼承繼承是代碼重用的有力手段,但是在Java程序開(kāi)發(fā)匯總,我們更推薦在包的內(nèi)部使用繼承,主要是因?yàn)檫@種方式相對(duì)于包外的繼承更安全。 與通過(guò)組合形式的方法調(diào)用不同,繼承打破了封裝性,子類依賴其父類中特定的功能細(xì)節(jié)。 第五條:接口優(yōu)于抽象類Java程序中提供了接口和抽象類來(lái)實(shí)現(xiàn)多個(gè)實(shí)現(xiàn)的類型。明顯的區(qū)別是抽象類中允許包含某些方法的實(shí)現(xiàn),接口中是不允許的。Java中的類是單繼承,搜易抽象類作為類型定義會(huì)收到極大的限制。使用接口主要有以下好處:
我們知道通過(guò)接口的多實(shí)現(xiàn)特性可以構(gòu)建多層次的類結(jié)構(gòu),我們同時(shí)也可以通過(guò)對(duì)每個(gè)接口都提供一個(gè)抽象的骨架實(shí)現(xiàn)類,把接口和抽象類的優(yōu)點(diǎn)結(jié)合起來(lái)。 第六條:接口只用于定義類型在我們開(kāi)發(fā)中,我們一定出現(xiàn)過(guò)在接口中定義靜態(tài)常量的情況,這種接口稱之為常量接口。 常量接口是對(duì)接口的不恰當(dāng)使用。在Java中如果我們要定義常量,可以使用枚舉的方式進(jìn)行定義?;蛘咄ㄟ^(guò)不可實(shí)例化的工具類來(lái)導(dǎo)出這些常量,避免通過(guò)實(shí)現(xiàn)綁定到具體的類上。 第七條:類層次優(yōu)于標(biāo)簽類類層次在前面我們已經(jīng)知道了,那什么是標(biāo)簽類呢?如下面: 這種標(biāo)簽類存在很多缺點(diǎn),里面包含了很多樣板代碼,里面包含了枚舉聲明、標(biāo)簽句以及條件判斷,由于很多亂七八糟的邏輯囊括在一個(gè)類中,破壞了可讀性,內(nèi)存占用也響應(yīng)的增加了。 那么針對(duì)標(biāo)簽類我們?nèi)绾蝺?yōu)化呢?這里就可以使用到層次類來(lái)進(jìn)行優(yōu)化,將標(biāo)簽類轉(zhuǎn)換為層次類首先要為標(biāo)簽類中的每個(gè)方法定義一個(gè)包含該方法的抽象類,比如area方法。接下來(lái)就是為原始標(biāo)簽類定義根類的具體子類。 通過(guò)上面的優(yōu)化體驗(yàn)上來(lái)說(shuō),就是規(guī)劃好累的層次,精簡(jiǎn)類的職能。 第八條:優(yōu)先考慮靜態(tài)成員類定義在一個(gè)類中的內(nèi)部類稱之為嵌套類。嵌套類存在的目的是為了輔助它的外圍類,如果嵌套類出現(xiàn)用于外部其它環(huán)境中,它就應(yīng)該被定義成頂層類。嵌套類有四中:靜態(tài)內(nèi)部類、非靜態(tài)成員類、匿名類和局部類。除了靜態(tài)內(nèi)部類外,其它的三種都被稱之為內(nèi)部類。 靜態(tài)成員類是最簡(jiǎn)單的一種嵌套類。與普通的類相差不大,只是定義在另一個(gè)類的內(nèi)部,它可以訪問(wèn)外圍類的所有成員,包含那些私有成員,它和靜態(tài)成員一樣。 非靜態(tài)成員類的每個(gè)實(shí)例都隱藏著與外圍類的一個(gè)實(shí)例引用。非靜態(tài)成員類可以調(diào)用外圍類的方法,或者通過(guò)修飾后的this獲取外圍類的實(shí)例引用。如果嵌套類的實(shí)例可以在它的外圍類的實(shí)例之外獨(dú)立存在,這個(gè)類就必須是靜態(tài)成員類。 如果聲明成員類不要求訪問(wèn)外部實(shí)例,就要始終把static修飾符放到它的聲明中,使它成為靜態(tài)成員類,而不是非靜態(tài)成員類。如果省略了static修飾符,則每個(gè)實(shí)例都將包含一個(gè)額外指向外圍對(duì)象的引用,保存這份引用需要耗費(fèi)時(shí)間和空間。 匿名類不同于任何Java中的其它語(yǔ)法單元,它不與其他成員一起被聲明,而是在使用的同時(shí)被聲明和實(shí)例化。 總結(jié)通過(guò)這一章的接口和類的比較,增加了對(duì)接口和類的更深入了解,同時(shí)對(duì)類的設(shè)計(jì)有了更進(jìn)一步的思考。主要體現(xiàn)在以下幾個(gè)方面:
|
|
來(lái)自: 2017helloworld > 《待分類》