JAVA編碼(代碼)規(guī)范及實(shí)踐_第1頁(yè)
JAVA編碼(代碼)規(guī)范及實(shí)踐_第2頁(yè)
JAVA編碼(代碼)規(guī)范及實(shí)踐_第3頁(yè)
JAVA編碼(代碼)規(guī)范及實(shí)踐_第4頁(yè)
JAVA編碼(代碼)規(guī)范及實(shí)踐_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java編碼規(guī)范及實(shí)踐

目錄

Java編碼規(guī)范及實(shí)踐.........................................................................................1

1.2術(shù)語(yǔ)...................................................................................................2

1.3約束...................................................................................................3

I|!(conditions&&condition6)){.........................................................14

4.1一般命名規(guī)范..........................................................................................14

IQuery,IDataAccess,IReportBuilder......................................................15

MAX_TIMES,DEFAULT_NAME..................................................................15

4.2一特殊命名規(guī)范......二..................................................................................17

AbstractReportBuilder,AbstractBeanFactory..............................................18

AccessException,RuntimeException.......................................................19

5.2一般原則..............................................................................................20

1.代碼應(yīng)該和注釋保持同步,如果代碼和注釋不同步,則閱讀代碼的人會(huì).....................................20

2.注釋盡量簡(jiǎn)潔,尺度沒(méi)有準(zhǔn)確的定義,大部分人能明白即可,可以將自.....................................20

ResultgetResult()throwsException{....................................................21

ObjectgetAction();......................................................................22

JavaDoc工具不要改變格式.................................................................................22

Getadefaultdate/timeformatterthatusestheSHORT..................................23

Thread,sleep(1000);......................................................................24

Derived,如果一個(gè)方法可以接受基類對(duì)象b的話:methodi(Baseb),...............................25

7.1工廠模式..............................................................................................26

7.1.1簡(jiǎn)單工廠..............................................................................................26

7.1.2工廠方法..............................................................................................26

7.2單例模式..............................................................................................27

Client:............................................................................................................................................................................................................27

7.3適配器模式...........................................................................................28

7.4組合模式..............................................................................................29

Client:............................................................................................................................................................................................................29

7.5外觀模式..............................................................................................30

Client:............................................................................................................................................................................................................30

7.6代理模式..............................................................................................31

7.7命令模式..............................................................................................32

Client:............................................................................................................................................................................................................33

7.8觀察者模式...........................................................................................33

7.9策略模式..............................................................................................35

Client:............................................................................................................................................................................................................35

IKeyPairGenerabledesGenerator=........................................................35

IKeyPairGenerablersaGenerator=........................................................36

IKeyPairGenerableideaGenerator=.......................................................36

KeyPairManagermanager=newKeyPairManager();..........................................36

7.10模版方法模式.........................................................................................36

7.11參觀者模式...........................................................................................38

總價(jià)格......................................................................................................40

Client:............................................................................................................................................................................................................40

第1章概述

1.1前言

代碼之于程序員,就像零件之于機(jī)械工,莊稼之于農(nóng)民,它是軟件的基

石,一行行代碼都是程序員的心血經(jīng)過(guò)日日夜夜凝結(jié)成的。做為一個(gè)程序員,

應(yīng)該像母親呵護(hù)孩子一樣呵護(hù)自己的代碼,它不僅僅是一行一行的文字,它

是一個(gè)程序員的尊嚴(yán)和價(jià)值所在;它是活的,你甚至能感受到它的心跳。編

碼規(guī)范只是大家達(dá)成一致的約定,這樣大家的代碼就可以互相看懂,維護(hù)起

來(lái)更加容易,思想更暢快的交流,經(jīng)驗(yàn)更快的得到傳播。代碼規(guī)范不是束縛

程序員的桎梏,應(yīng)該知道,不遵守規(guī)范的個(gè)性的代碼并不代表程序員的性格,

并不能張揚(yáng)個(gè)性。個(gè)性應(yīng)該體現(xiàn)在用更簡(jiǎn)單、更優(yōu)雅、更易讀、更易理解以

及算法實(shí)現(xiàn)效率更高等方面。

可讀性,可理解性是代碼的重要方面,本規(guī)范主要圍繞如何去產(chǎn)生規(guī)范

易讀的代碼。另外,它也保證了大家有共同的先驗(yàn)知識(shí)。

1.2術(shù)語(yǔ)

Pascalcase一所有單詞第一個(gè)字母大寫(xiě),其它字母小寫(xiě)。

例:Person,OrderDetail,OilTanko

Camelcase—除了第一個(gè)單詞,所有單詞第一個(gè)字母大寫(xiě),其他字

母小寫(xiě)。

例:oilLevelzcustomerName

在后面的描述中我們使用Pascal代表第一種表示方式,Camel代表第二

種表示方式。

1.3約束

沒(méi)有一個(gè)規(guī)范可以到處適用,也不可能無(wú)所不包。

1.本規(guī)范并非完全強(qiáng)制性規(guī)范,對(duì)于任何違背本規(guī)范但能提高代碼可

讀性的措施,都可以采用。

2.本規(guī)范第3,4,5章為強(qiáng)制性規(guī)范,其它章節(jié)為建議規(guī)范。如違背

本條,請(qǐng)參考第一條。

第2章一般規(guī)則

1)所有包,類,接口,方法,屬性,變量,參數(shù)均使用英文單詞進(jìn)行命名,具

體細(xì)節(jié)請(qǐng)參見(jiàn)命名規(guī)范一章。

2)命名包,類,接口,方法以及變量時(shí),盡量使用貼近問(wèn)題域的表意豐富的名

稱。

3)修改源代碼時(shí),應(yīng)盡量保持與所修改系統(tǒng)的編碼風(fēng)格保持一致。

4)所有包名使用必須使用com.[company]前綴,所有項(xiàng)目使用com.

[company].[projectname],company是公司簡(jiǎn)稱,projectname是項(xiàng)目的縮寫(xiě)。

第3章格式規(guī)范

5)包的導(dǎo)入應(yīng)該按照相關(guān)性進(jìn)行分組。

importjava.io.lOException;

importjava.net.URL;

importjava.rmi.RmiServer;

importjava.rmi.server.Server;

importjavax.swing.JPanel;

importjavax.swing.event.ActionEvent;

importorg.linux.apache.server.SoapServer;

6)只倒入明確需要的類,這樣只要看導(dǎo)入列表,就可以知道該類依賴于哪些類

和接口,保證可讀性。

importjava.util.List;//J@importjava.util,*

importjava.util.Arraylist;

importjava.util.HashSet;

7)類和接口中元素的布局順序。

1.類和接口的文檔描述

2.類和接口的聲明

3.類的靜態(tài)變量,按照public,protected,private的順序。

4.實(shí)例變量,按照public,protected,private的順序。

5.類的方法,無(wú)固定順序。

8)類的聲明,基類和實(shí)現(xiàn)的接口應(yīng)該獨(dú)立成行,保證可讀性。

classUserManagerlmpl

extendsAbstractManager

implementslUtjeiMdiiciyeL{

9)方法修飾關(guān)鍵字定義順序。

〈public,protected,private>staticabstractsynchronized

unuaualfinalnativemethodName

注意訪問(wèn)標(biāo)示符一定要在最前面。

publicstaticdoublesquare(doublea);

staticpublicdoublesquare(doublea);

10)變量聲明,采用Camel表示法不要在一行聲明多個(gè)變量。

//推薦

intlevel;

intsize;

//避免

intlevel,size;

11)保證明確的類型轉(zhuǎn)換,不要默認(rèn)進(jìn)行隱式類型轉(zhuǎn)換

intValue=(int)floadvalue;//避免intValue=floatvalue

12)數(shù)組指示符緊跟類型變量

int[]a=newint[20];//inta[]=newint[20]

一個(gè)變量要代表獨(dú)立的意思,不要在其生命周期賦予它不同的概念。

inttempValue;

tempValue=maxValje;

LeiupValue=miiiValje;

tempValue=anotherValue;

tempValue在生命周期內(nèi)表示了各種各樣的意圖,增加理解代碼的難度。

應(yīng)該為每個(gè)獨(dú)立概念定義單獨(dú)的變量:

inttempMaxValue;

inttempMinValue;

inttempAnotherValue;

13)僅僅循環(huán)控制變量才能出現(xiàn)在for()循環(huán)中

sum=0;

for(i=0;i<100;i++){

sum+=value[i];

)

播免:

for(i=0.sum=0;i<100:i++)(

sum+=value[i];

/

14)循環(huán)變量應(yīng)靠近循環(huán)體初始化

isDone=false

while(!isDone){

}

//避免

isDone=false;

while(!isDone){

15)避免長(zhǎng)的布爾表達(dá)式,應(yīng)換成多個(gè)更容易理解的表達(dá)式。

boolisFinished=(elementNo<0)||(elementNo>maxElement);

boolisRepeatedEntry=elementNo==lastElement;

if(isFinished||isRepeatedEntry){

//避免

if((elementNo<0)||(elementNo>maxElement)\\elementNo==

lastElement){

16)不要在條件語(yǔ)句中執(zhí)行方法,以提高可讀性

Inputstreamstream=File.open(fileName,nwn);

if(stream!=null){

)

播免

if(File.open(fileNamet/=null)){

/

17)代碼縮進(jìn),應(yīng)該使用4個(gè)空格為一個(gè)單位進(jìn)行縮進(jìn),

publicStringinvoke()throwsException{

....StringprofileKey="invoke:H;

try{

....UtilTimerStack.push(profileKey);

if(executed){

....test=true;

)

catch(

)

18)條件語(yǔ)句的主要形式,即使單條語(yǔ)句,也要使用括號(hào)括起來(lái)。

if(condition){

statements;

}

if(condition){

statements;

Felse{

statements;

)

if(condition){

statements;

)elseif(condition){

statements;

?else(

statements;

)

19)空循環(huán)體也要使用完整的塊

for(initialization;condition;update){

*

)

20)switch語(yǔ)句的使用格式

switch(condition){

caseABC:

statements;

//穿透,一定要做出注釋

caseDEF:

statements;

break;

caseXYZ:

statements;

break;

default:

statements;

break;

I

21)try-catch使用格式

try(

statements;

}

catch(Exceptionexception)

statements;

)

try(

statements;

}

catch(Exceptionexception)

statements;

}

finally(

statements;

22)空格的使用

1.運(yùn)算符兩邊應(yīng)該各有一個(gè)空格。

2.Java保留字后面應(yīng)跟隨一個(gè)空格。

3.逗號(hào)后面應(yīng)跟隨一個(gè)空格。

4.冒號(hào)兩個(gè)應(yīng)各有一個(gè)空格。

5.分號(hào)后面應(yīng)跟隨一個(gè)空格。

a=(b+c)*d;//NOT:a=(b+c)^d

while(true){//NOT:while(true)l...

doSomething(arb,c,d);//NOT:doSomethingfa,b,c,d);

case100://NOT:case100:

for(i=0;i<10;i++){//NOT:far(i=0;i<10;i+^){...

23)空行的使用

1.文件頭部注釋、package語(yǔ)句和import語(yǔ)句之間。

2.class之間

3.方法之間

4.方法中,變量的申明和具體代碼之間。

5.邏輯上相關(guān)的語(yǔ)句段之間

6,塊注釋和行注釋的前面

▽—代表空行

V

packageXXX.XXX;

V

importXXX.XXX.XXX.XXX;

V

publicclassUserFileAccess

V

//

privateintmyObjId;

V

/★★

*

*/

publicUserFileAccess()

/**

*

★/

publicvoidgetCtllnfo()

intcount;

Stringmsg;

V

count=100;

???

V

//實(shí)現(xiàn)代碼注釋前空行

msg="MESSAGE”;

V

count=dataCount;

if(count==0){

)

)

V

/**

*

*/

privateclassUserFileRead{

24)邏輯上緊密相關(guān)的代碼塊應(yīng)該用一個(gè)空行分開(kāi)。

//Createanewidentitymatrix

Matrix4x4matrix=newMatrix4x4();

//Precomputeanglesforefficiency

doublecosAngle=Math.cos(angle);

doublesinAngle=Math.sin(angle);

//Specifymatrixasarotationtransformation

matrix.setElement(lz1,cosAngle);

matrix.setElement(1,2,sinAngle);

matrix.setElement(2Z1,-sinAngle);

matrix.setElement(2Z2,cosAngle);

//Applyrotation

transformation.multiply(matrix);

25)為了保證可讀性,變量名應(yīng)該左對(duì)齊。

TextFilefile;

intnPoints;

doublex,y;

//避免

TextFilefile;

intnPoints;

doublex,y;

26)像前面一般規(guī)則里說(shuō)的那樣,任何提高代碼可讀性的排版都可以去嘗試,

下面是一些例子。

if(a==lowValue)compueSomething();

elseif(a==mediumvalue)computeSomethingElse();

elseif(a==highValue)computeSomethingElseYet();

value=(potential*oilDensity)/constantl+

(depth*waterDensity)/constant2+

(zCoordinaLeValue*gasDensity)/constants;

minPosition=computeDistance(min,x,y,z);

averagePosition=computeDistance(average,x,y,z);

switch(phase){

casePHASE_OIL:text="Oil";break;

casePHASE_WATER:text="Watern;break;

casePHASE_GAS:text="Gas";break;

27)當(dāng)對(duì)if語(yǔ)句中的條件進(jìn)行折行時(shí),應(yīng)該使折行的條件語(yǔ)句相對(duì)主功能

語(yǔ)句再行縮進(jìn)4個(gè)空格,以突出主要功能語(yǔ)句。

//使用這種縮進(jìn),突出主要功能語(yǔ)句。

if((conditionl&&condition?)

II(conditions&&condition4)

II!(conditions&&condition6)){

doSomethingAboutlt();

//避免使用這種縮進(jìn),主功能語(yǔ)句不突出。

if((conditionl&&condition?)

II(conditions&&conditiond)

I|!(conditions&&condition6)){

doSomethingAboutlt();

28)三元條件運(yùn)算符

可以使用如下三種表達(dá)方式,條件要用括號(hào)括起來(lái)。

alpha=(aLongBooleanExpression)?beta:gamma;

alpha-(aLongBooleanExpression)?beta

:gamma;

alpha=(aLongBooleanExpression)

?beta

:gamma

第4章命名規(guī)范

4.1一般命名規(guī)范

29)包名應(yīng)該用小寫(xiě)字母,不要出現(xiàn)下劃線等符號(hào),名詞用有意義的縮寫(xiě)或

者英文單詞。

示例:

//推薦

com.esse.business

java.lang.util

//避免

com.Esse-tech.business

30)所有類命名使用Pascal表示方式,使用名詞組合,

UserManager,ClassLoader,HttpHeaderResult

31)接口命名使用字母''工〃加上Pascal形式的表示方式。

工Query,IDataAccess,IReportBuilder

32)使用名詞組合或形容詞去命名一個(gè)接口,接口聲明了一個(gè)對(duì)象能提供的

服務(wù),也描述了一個(gè)對(duì)象的能力。一般以“able”和“ible”作為后綴,

代表了一種能力。

publicinterfaceRunnable<

publicvoidrun();

}

publicinterfaceAccessible(

publicContextgetContext();

)

33)變量名和參數(shù)名使用Camel表示方式。

userName,objectFactory,entrys,list

34)對(duì)于常量名,使用大寫(xiě)字母,并使用下劃線做間隔。

MAX_T工MES,DEFAULT_NAME

程序中應(yīng)該使用常量代替'、25〃,''100〃等實(shí)際的數(shù)字,如:

//推薦

if(times==MAX_TIMES){

//避免

if(times==25){

這樣做的好處是,當(dāng)因需要修改實(shí)際的數(shù)字時(shí),比如修改25為30,只需要

修改一處。

35)方法名應(yīng)該使用動(dòng)詞開(kāi)頭,使用Camel表示方式,一般由動(dòng)詞+名詞組

成。

getName,initialize,addParameterrdeleteUser

36)縮寫(xiě)字母也應(yīng)該保持首字母大寫(xiě)

cxportHtmlSource();〃避免;exportHTMLSourcc();

openDvdPlayer();//避免:

37)變量的名字應(yīng)該和類型名稱一致

voidsetTopic(Topictopic)//voidsetTopic(Topicvalue)

//避免:voidsetTopic(TopicaTopic)

//避免:voidsetTopic(Topict)

voidconnect(Databasedatabase)

//避免:voidconnect(Databasedb)

〃避免:voidconnect(DatabaseoracleDB)

當(dāng)同時(shí)定義多個(gè)屬于同一個(gè)類的變量時(shí),把類型作為實(shí)例的后綴,如:

PointstartPoint;

PointcenterPoint;

這樣做是為了從實(shí)例名就可以推斷它的類型名稱。

38)根據(jù)變量的作用范圍,作用范圍大的應(yīng)該使用長(zhǎng)名稱,作用范圍大,表

明變量的生命周期比較長(zhǎng),為了有助十理解,應(yīng)盡量用長(zhǎng)名稱以表達(dá)變量的

真實(shí)意圖。反之,對(duì)于作用范圍小,可以使用一些簡(jiǎn)化的名稱,比如i,j,

k等,提高編程效率。

for(inti=0;i<times;i++){

4.2特殊命名規(guī)范

39)使用get/set對(duì)類屬性進(jìn)行訪問(wèn),這是Java社區(qū)的核心編碼規(guī)范。

40)使用is前綴表示一個(gè)布爾變量和方法。

isUsedzisEmpty,isVisible,isFinished

有時(shí)也可以使用has,can,should:

booleanhasLicense();

booleancanEvaluate();

boolpanshou1dAbort.=fa1SA;

41)在查詢方法中應(yīng)使用find作為前綴

vertex.findNearestVertex();

matrix.findSmallestElement();

node.findShortestPath(NodedestinationNoce);

42)使用initialize做為對(duì)象初始化的方法前綴,也可以簡(jiǎn)寫(xiě)為init

initializer!les();

init();

initFontSet();

43)對(duì)于對(duì)象集合,變量名稱應(yīng)使用復(fù)數(shù)。

Collection<Point>points;

int[]values;

44)對(duì)于抽象類,應(yīng)該使用Abstract前綴。

AbstractReportBuilder,AbstractBeanFactory

45)對(duì)于表示編號(hào)的變量,應(yīng)加No后綴。

tableNo,userNo,employeeNo

46)常在一起使用的對(duì)稱詞匯,這些詞匯一起使用,方法的表達(dá)意圖自然可

以互相推測(cè)和演繹。

get/setzadd/remove,create/destroy,start/stop,

insert/delete,increment/decrementzbegin/end,first/lastz

up/down,min/max,next/previous,old/new,open/closez

show/hide,suspend/resume

47)避免使用否定布爾變量

boolisError;//避免:isNoError

boolisFound;//避免:isNoiFoimd

48)異常類應(yīng)該使用Exception做為后綴。

AccessExceptionfRuntimeException

49)缺省接口實(shí)現(xiàn)應(yīng)該使用Default前綴

classDefaultTableCellRenderer

implementsTableCellRenderer{

)

50)對(duì)于單例類(Singleton),應(yīng)該使用getlnstance方法得到單例。

classUnitManager{

privatefinalstaticUnitManagerinstance=newUnitManager();

privateUnitManager(){

publicstaticUnitManagergetlnstance(){

returninstance_;

)

)

51)對(duì)于工廠類,進(jìn)行創(chuàng)建對(duì)象的方法,應(yīng)該使用new前綴

classPointFactory{

publicPointnewPoint(???){

)

第5章注釋規(guī)范

5.1概述

代碼中為什么要包含注釋?

1.別人要調(diào)用你的程序中的公共接口,對(duì)這部分進(jìn)行文檔描述,使別人能

夠正確而有效的使用它。

2.除了自己,別人要閱讀和維護(hù)你的代碼。為了使代碼更容易維護(hù),首先

要使代碼更易于理解,才能在理解的基礎(chǔ)上進(jìn)行維護(hù)。對(duì)這些代碼進(jìn)行

文檔描述,將使這個(gè)過(guò)程變得更加容易。

對(duì)代碼進(jìn)行注釋,是在代碼可讀性的基礎(chǔ)上,使用自然語(yǔ)言對(duì)代碼所表

達(dá)的意思進(jìn)行闡述。并不是說(shuō)代碼可以寫(xiě)的很爛,注釋寫(xiě)的很詳細(xì),這不是

好的方式。如果代碼可讀性很好,命名表意豐富,清晰,一般不需要特別多

的注釋。對(duì)于類,主要著重要描述它的職責(zé),即它能干什么,對(duì)于復(fù)雜的算

法實(shí)現(xiàn),應(yīng)該使用內(nèi)部實(shí)現(xiàn)注釋,說(shuō)明算法的主要思路,對(duì)于長(zhǎng)方法,要讓

閱讀代碼的人比較容易的明白方法實(shí)現(xiàn)的主要流程。反之,對(duì)于一看就懂的

方法,則不需要進(jìn)行注釋,比如get/set方法。

5.2一般原則

1.代碼應(yīng)該和注釋保持同步,如果代碼和注釋不同步,則閱讀代碼的人會(huì)

想,、'到底是代碼準(zhǔn)確,還是注釋準(zhǔn)確啊〃,換誰(shuí)都會(huì)糊涂。

2.注釋盡量簡(jiǎn)潔,尺度沒(méi)有準(zhǔn)確的定義,大部分人能明白即可,可以將自

己的代碼給同事看看。太簡(jiǎn)單的方法就不要注釋了,比如上面提到的

get/set方法。

5.3注釋內(nèi)容

/*

*Copyright(c)2002-2006byOpenSymphony

*Allrightsreserved.

packagecom.opensymphony.xwork2;

importerceptor.PreResultListener;

importcom.opensymphony.xwork2.util.ValueStack;

importjava.io.Serializable;

*類職責(zé)簡(jiǎn)要描述

*^authorJasonCarreira

*@seecom.opensymphony.xwork2.ActionProxy

*/

publicclassActioninvocationimplementsSerializable{

*方法簡(jiǎn)要描述

*方法詳細(xì)描述

*JavaDoctags,比如

*^author

*@version

*@see。o

*@returnaResultinstance

ResultgetResult()throwsException{

//內(nèi)部實(shí)現(xiàn)注釋/

//多行內(nèi)部實(shí)現(xiàn)注釋I5

Stringname=this.ge^e();

GettheActionassociatedwiththisActionInvocation

ObjectgetAction();

*^returnwhetherthisActionInvocationhasexecutedbefore.

*executed.

*/

booleanisExecuted();

*InvokesthenextstepinprocessingthisActioninvocation.

*one.IfInterceptorschoosenotto

*theywillcallinvoke()toallowthenextInterceptortoexecute

*theActionisexecuted.IftheActionProxygetExecuteResult

*/

Stringinvoke()throwsException;

①代碼的版權(quán)信息。

②類描述信息,描述類的主要職責(zé)和用處。

(§)方法描述信息,描述方法是做什么的,如何調(diào)用,最好給出調(diào)用代碼示例。

④JavaDoctags,用來(lái)生成Html形式的API文檔

⑤內(nèi)部實(shí)現(xiàn)注釋,用于描述復(fù)雜的算法,長(zhǎng)方法,從為什么要這么做角度去

描述

52)盡可能在類描述中加入代碼調(diào)用示例,使用<pre></pre>標(biāo)記,提示

JavaDoc工具不要改變格式.

/**

*DateFormatisanabstractclassfordate/timeformatting

*formatsandparsesdatesortimeinalanguage-independentmanner.

<pre>

*myString=DateFormat.getDatelnstance().format(myDate);

*</pre>

<pre>

*DateFormatdf=DateFormat.getDatelnstance();I

包含代碼調(diào)彳示

*for(inti=0;i<myDate.length;++i){7^^^例

*output.printin(df.format(myDate[i])+";”);

*</pre>

@seeFormat

@seejava.util.TimeZone

Aversion1.5104/12/04

?authorMarkDavis,Chen-LiehHuang,AlanLiu

publicabstractclassEateFormatextendsFormat{

53)使用?deprecated廢棄方法,不要?jiǎng)h掉它。

*?deprecated

Getadefaultdate/timeformatterthatusestheSHORT

dateandthetime.

publicfinalstaticDateFormatgetlnstance(){

returngetDateTimelnstance(SHORT,SHORT);

54)使用行末注釋對(duì)深層嵌套代碼進(jìn)行注釋

for(i...){

for(j...){

while(...){

if(...){

switch(...){

i//endswitch

}//endif

)//endwhile

)//endfori

i//endforj

第6章編程實(shí)踐

55)對(duì)于靜態(tài)方法,應(yīng)該使用類名去使用,不應(yīng)該用實(shí)例去引用,主要是為

了體現(xiàn)更多的語(yǔ)義。

Thread.sleep(1000);

〃避免,無(wú)法體現(xiàn)sleep是靜態(tài)方法還是實(shí)例方法

thread.sleep(1000);

56)對(duì)一些基本數(shù)據(jù)類型和不太可能通過(guò)繼承進(jìn)行擴(kuò)展的類,應(yīng)聲明為

final,提高效率。

57)類和方法的粒度保持適中,保持類的規(guī)模盡量短小,職責(zé)單一。小類有

很多好處,易于設(shè)計(jì),易于測(cè)試,易于理解。同樣方法也要盡量的小,每個(gè)

方法盡量不要超出25行。

58)開(kāi)閉原則,軟件應(yīng)該對(duì)擴(kuò)展開(kāi)發(fā),對(duì)修改開(kāi)放。也就是說(shuō),應(yīng)該在不修

改以前源代碼的基礎(chǔ)上,改變程序的行為以適應(yīng)新的需求。

59)里氏代換原則:假設(shè)有兩個(gè)類,一個(gè)是基類Base,一個(gè)是派生類

Derived,如果一個(gè)方法可以接受基類對(duì)象b的話:methcdl(Baseb),

同樣,這個(gè)方法也應(yīng)該接受派生類Derived的對(duì)象d,而不影響方法的行

為。里氏代換原則是繼承復(fù)用的基石。

60)抽象依賴原則(穩(wěn)定依賴原則)。應(yīng)該依賴于抽象而不依賴與具體類,抽

象的類和接口是穩(wěn)定的,而具體類是易變的,如果依賴于具體類,代碼就會(huì)

非常脆弱,失去了靈活性。

61)接口隔離原則,一個(gè)類對(duì)另外一個(gè)類的依賴應(yīng)該建立在最小的接口之上

的。

62)單一職責(zé)原則,如果一個(gè)類有多于一種的職責(zé),當(dāng)需求變化時(shí),類的職

貢就要發(fā)生變化,而囚此就會(huì)引起引用該類的代碼發(fā)生改變,職貢越多,這

個(gè)類就容易跟更多的類產(chǎn)生耦合關(guān)系,而且改變一個(gè)職責(zé),可能會(huì)影響到另

外一個(gè)職責(zé)的履行。

63)編寫(xiě)代碼前,先編寫(xiě)注釋(可以認(rèn)為是偽代碼),先想后寫(xiě)。

/★★

*報(bào)表構(gòu)建器,主要職責(zé):

*1.創(chuàng)建拷貝報(bào)表模版

*2.填充報(bào)表數(shù)據(jù)

*3.構(gòu)建報(bào)表

*4.畫(huà)圖處理

★/

通過(guò)編寫(xiě)這些偽代碼,可以起到理清思路的作用,這時(shí)候再編寫(xiě)代碼,過(guò)程

就非常流暢了,不會(huì)編一會(huì)兒,想一會(huì)兒,刪掉代碼,再重新編。

第7章設(shè)計(jì)模式快速參考

本章描述常見(jiàn)的設(shè)計(jì)模式。描述主要由兩部分組成,一部分是模式代碼,一

部分時(shí)調(diào)用示例。

7.1工廠模式

7.1.1簡(jiǎn)單工廠

abstractclassFruit{

classAppleextendsFruit{

i

classOrangeextendsFruit{

classFruitFactory{

pulicstaticFruitgetFruit(StringfruitType){

if(''apple"==fruitType){

returnnewApple();

)elseif(''orange"==fruitType){

returnnewOrange();

Client:

Appleapple=FruitFactory.getFruit(''apple,/);

7.1.2工廠方法

interfaceIFruitFactory{

publicFruitgetFruit();

classAppleFactoryimplementsIFruitFactory{

publicFruitgetFruit(){

//生產(chǎn)蘋(píng)果

returnnewApple();

}

}

Client:

IFruitFactoryfactory=newAppleFactory();

Fruitfruit=newfactory.getFruit();

7.2單例模式

classSingleton{

privatestaticSingletonsingleton=null;

publicstaticSingletongetlnstance(){

if(null==singleton){

singleton=newSingleton();

)

returnsingleton;

)

publicStringotherOperation(){

//方法實(shí)現(xiàn)

Client:

Stringstr=Singleton.getlnstance().otherOperation();

多線程時(shí)使用double-check模式確保線程安全:

classSingleton{

privatestaticSingletonsingleton=null;

publicstaticSingletongetlnstance(){

if(null==singleton)

sychronized(Singleton.class){

if(null==singleton){

singleton=newSingleton();

}

j

returnsingleton;

7.3適配器模式

interfacePowerable{

llOvprovide();

I

classllOv{

}

class220v{

}

classHOvPowerimplementsPowerable{

publicllOvprovide(){

//提供llOv電壓

class220vPower{

public220vprovide(){

//提供220v電壓

class220vAdapterimplementsPowerable{

publicllOvprovide(){

llOvvoltage=null;

220vPowerpower=new220vPower();

〃轉(zhuǎn)換過(guò)程,@!@#$%人

returnvoltage;

Client:

Powerableprovider=new220vAdapter();

vide();

7.4組合模式

abstractclassHardware{

classMainboardextendsHardware{

classMemoryextendsHardware{

classDisplayextendsHardware(

classNetworkAdapterextendsHardware{

i

classComputerextendsHardware[

privateListparts=newArraylist();

publicListadd(Hardwarehardware){

parts.add(hardware);

returnparts;

Client:

Computercomputer=newComputer();

Mainboardmainboard=newMainboard();

NetworkAdapternetworkAdapter=newNetworkAdapter();

Displaydisplay=newDisplay();

Memorymemory=newMemory();

computer.add(mainboad)

.add(networkAdapter)

.add(display)

.add(memory);

7.5外觀模式

為一組類提供簡(jiǎn)單的外部接口,使外部調(diào)用者不需要和所有內(nèi)部干系人打交

道,就能讓調(diào)用者滿意。

classCallCenter{

publicvoidsolve(Customercustomer){

//接受客戶提出的問(wèn)題

operator.acceptProblem(customer.getProblem());

booleancanSolved=operator.solve();

if(!canSolved){

//如果不能解決,則請(qǐng)求其它人幫助。

operator.askHelp();

classCustomer{

publicvoidcall(CallCentercallCenter){

callCenter.solve(this);

)

classOperator{

i

Client:

CallCentercallCen二er=newCallCenter();

CustomaCustomer=newCustomer();

aCustomer.call(callCenter);

這里對(duì)客戶來(lái)講,與他接觸的只有一個(gè)接口,就是接線員,最后的結(jié)果

是解決他的問(wèn)題。接線員可以直接解決,如果他不能解決,它可以選擇請(qǐng)求

其它人的幫助去解決這個(gè)問(wèn)題??蛻羰遣魂P(guān)心接線員在內(nèi)部做了什么。

7.6代理模式

classFileDownloader(

publicdownload(Filefile);

}

classFile{

}

//一般代理類使用Proxy后綴

classFileDownloaderProxy{

FileDownloaderProxy(FileDownloaderdownloader){

this.downloader=downloader;

)

privateFileDownloaderdownloader;

publicdownload(Filefile){

//這里可以添加通知,通知用戶開(kāi)始下載文件

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論