Java編程規(guī)范_第1頁
Java編程規(guī)范_第2頁
Java編程規(guī)范_第3頁
Java編程規(guī)范_第4頁
Java編程規(guī)范_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、工程管理系統(tǒng)工程規(guī)劃一般地,開發(fā)一個產(chǎn)品或項目時,需要對整個應(yīng)用程序有一個整體上的或者說全局上的規(guī)劃。比如,層次劃分和模塊化。按分層進(jìn)行組織的設(shè)計結(jié)構(gòu)中,只允許上層的程序引用下層的程序,而不允許出現(xiàn)下層的程序引用上層的程序,依賴關(guān)系要做到單向化(偏序依賴)。另 一個概念模塊化,主要是指把程序組織成多個邏輯概念相對獨立的單元,便于維護(hù)和管理。這些單元在物理上的體現(xiàn)主要是程序工程(也有叫作項目的,英文表示是 Project)。單元的劃分要遵從高內(nèi)聚低耦合的原則進(jìn)行。單元之間的依賴關(guān)系也必須是單向的,并且不與系統(tǒng)整體上的層次關(guān)系產(chǎn)生沖突。以上內(nèi)容主要在開發(fā)周期中的設(shè)計階段完成,還有一些其它內(nèi)容,概括

2、起來,需要明確的主要有以下一些內(nèi)容:· 系統(tǒng)的層次結(jié)構(gòu)及工程存放目錄組織· 構(gòu)成系統(tǒng)的所有工程的清單,包括各工程的類型、所處位置、內(nèi)容與其它說明等· 工程之間的依賴關(guān)系圖,包括依賴的第三方組件· 依賴的第三方組件或類庫的清單,包括名稱、版本、官方網(wǎng)站地址、其所依賴的其它組件和類庫,以及詳細(xì)的修改記錄(如果有修改的話)工程與配置管理Java 各類工程(Project)都包含特定的內(nèi)容,依工程類型(最常見的有類庫、控制臺程序和 WEB 應(yīng)用程序三類)不同,內(nèi)容也會有不同,但一些基本內(nèi)容是都有的,比如工程文件、Java 源程序文件、二進(jìn)制輸出目錄等。我 們利用

3、配置庫來達(dá)到統(tǒng)一管理和相互協(xié)作的目的。但 Java 工程中,并不是所有的內(nèi)容都需要或者說適合納入配置庫,比如說二進(jìn)制輸出目錄,它們只是一些臨時生成的數(shù)據(jù)或文件,并不需要持久保留,還有一些文件是用戶 使用的 IDE 或構(gòu)建工具存儲的特定文件等,同樣不應(yīng)該簽入配置庫。配置庫處理原則是,只把需要及合適的內(nèi)容簽入配置庫,其它內(nèi)容一律不入庫,以避免不必要的“垃圾”內(nèi)容和對他人的干擾。Java 工程中可能出現(xiàn)的,一定不要簽入配置庫的目錄及文件,包括但不限于以下所列:· maven 相關(guān)o target/· Eclipse 相關(guān)o bin/o .settings/o .projecto

4、.classpath· IDEA 相關(guān)o .idea/o *.ipro *.imlo *.iws· 臨時性文件o *.logo *.cacheo *.diffo *.patcho *.tmp· 系統(tǒng)相關(guān)o .DS_Storeo Thumbs.db代碼風(fēng)格命名風(fēng)格在使用 Java 語言編程的時候,盡量堅持以下的原則進(jìn)行命名:1. 名稱盡量要直接表明其含義,并且要使用英文單詞表述,盡量避免使用漢語拼音命名。名字的意思清楚比長度更重要,應(yīng)該與場景、系統(tǒng)的邏輯組成或物理組成以及為人熟知的概念相對應(yīng),而不是與技術(shù)或架構(gòu)相對應(yīng);2. 除一些約定俗成的單字母變量(如 i, j,

5、 k, v, x, y 等),禁止使用單字母變量。在使用單字母變量時,也僅限于表示約定的含義,如 i, j, k 表示循環(huán);v 表示取值;x, y 表示兩個操作數(shù);3. 命名時可以適當(dāng)使用單詞縮寫,但一定要含義明確,如 exec;4. 在命名的過程中要使用語義上有意義的名字,而不要使用編程語言特有的關(guān)鍵字。如:getLength() 比 getInt() 要好得多;5. 類命名盡量使用名詞性短語,如:FileCreator, HotelListManager, TaskWorker 等。6. 方 法命名一律以小寫字母開頭,命名時盡量不超過 3 個單詞,第一個單詞后的每個單詞首字母需要大寫。執(zhí)行

6、操作命令類型的方法命名時一般用動詞或動詞短語命名,如 Executor.execute() 等;執(zhí)行轉(zhuǎn)化命令類型的函數(shù)命名時一般用 toXxx(), parseXxx(), valueOf() 的形式命名,如:Object.toString(), Integer.parseInt(), Enum.valueOf();7. 類成員的命名盡量避免再使用類名(包括縮寫形式)做前綴,例如 User.getUserId() 命名為 User.getId() 更加合適;8. 避免使用 Java 預(yù)定義的類型名稱命名自己的類型。代碼組織包盡 量將功能相近或同屬一個性質(zhì)的類型放在同一包中(同屬一個性質(zhì)特指 u

7、til 或類似的包,并不是指 controller, service, model 等),這樣在開發(fā)的時候,就可以避免導(dǎo)入過多的包,且減少查找適用于特定任務(wù)的正確類型時所必須檢查的包的數(shù)量,也可以避免不相干內(nèi)容之間的相互干擾。從 一定程度上來說,就是包級別的高內(nèi)聚、低耦合。類Java 的類型分為引用類型和值類型兩類(正因為有值類型的存在,所以 Java 并不是純面向?qū)ο蟮恼Z言)。除 Java 預(yù)定義的 8 個基本類型是值類型之外,其它所有類型都是引用類型。引用類型在堆中分配,內(nèi)存管理由垃圾回收器處理。值類型在棧上或以內(nèi)聯(lián)方式在堆中分配。通常,值類型 的內(nèi)存分配和釋放開銷更小,所以,只要能夠采用

8、值類型的地方,應(yīng)優(yōu)先考慮值類型(只有當(dāng)值類型遇上 Java 5 引入的泛型時,才適合使用其相對應(yīng)的包裝類型)。然而,如果是在有大量的裝箱或拆箱操作的情況下,值類型的表現(xiàn)就不如引用類型了。以下規(guī)則中,不嚴(yán)格區(qū)分類、接口或枚舉等概念,統(tǒng)稱為類。1. 類名與文件名應(yīng)該保持一致;2. 類聲明必須處在某個包中,禁止在缺省包中聲明類;3. 在一個類文件中,除內(nèi)部類之外,應(yīng)該盡量只定義一個類,建議避免在一個文件中定義多個類。合適的情況下,可以考慮定義為內(nèi)部類,且優(yōu)先選擇靜態(tài)嵌套類;4. 只在需要公開給其他人使用的類前加上 public 關(guān)鍵字,內(nèi)部使用的類使用訪問級別更低的關(guān)鍵字來修飾;5. 不需要再被繼承

9、的類前加 final 關(guān)鍵字;6. 設(shè)計上一旦初始化便不打算再被改變的內(nèi)容,一律用 final 關(guān)鍵字修飾。接口與狹義上的類相比,接口具有其自身的獨特屬性,以下規(guī)則有助于正確設(shè)計接口:1. 除公開API, 應(yīng)優(yōu)先考慮定義類,而不是接口。因為在以后的版本調(diào)整中,可以安全地向類添加新成員,而對于接口,則只有修改很多代碼(可能有多個類實現(xiàn)了接口)才能添加成員,影響面很寬;2. 接口中定義每一個方法時要合理地設(shè)計會拋出的異常;3. 避免使用標(biāo)記接口(沒有成員的接口),可以使用自定義屬性(Annotation)作為類型標(biāo)記的方式;4. 請?zhí)峁┲辽僖环N接口實現(xiàn)的類型,這樣有助于確保正確設(shè)計和順利實現(xiàn)接口;

10、5. 盡量不要向以前提供的接口添加成員,如果接口的交付定義要求更多成員,則可以考慮定義新的接口擴(kuò)展已有接口并添加適當(dāng)成員。枚舉枚舉一般用于表示一組具有特定取值范圍的常量,所以其所有屬性都必須是不可變的,枚舉的定義中不能提供任何可以修改其任何狀態(tài)的途徑。Java 的枚舉在本質(zhì)上是類,屬于引用類型,可以考慮充分利用其多態(tài)特性。1. 一定要為枚舉提供一個“零”值。通常情況下,“零”值項被命名為 None、Unknown 或 Invalid 是合適的。如果不合適,請根據(jù)具體情況把“零”值定義為最合適的項(一般是用作默認(rèn)值的項);2. 構(gòu)造函數(shù)必須是私有的;3. 所有字段都必須是 final 的。字段字

11、段用于保存狀態(tài)數(shù)據(jù)。實例字段用于存儲對象的狀態(tài);靜態(tài)字段用于表示某個共享狀態(tài),特殊的,常量(或不可變字段)適合表示一些固定值或不變數(shù)據(jù)。在絕大多數(shù)情況下,類的所有的實例字段都應(yīng)是對外不可見的;而靜態(tài)字段應(yīng)盡量是常量(或不可變字段)。下面的規(guī)則有助于正確設(shè)計和使用字段:1. 不提供在實際上是公共訪問級別的實例字段和可變的靜態(tài)字段;2. 對不會更改的常量(或不可變數(shù)據(jù))使用常量字段(static final)。方法1. 盡量避免寫出超過 50 行的方法;2. 類應(yīng)該只對外公布必需的方法,盡可能的隱藏內(nèi)部實現(xiàn),在聲明方法時應(yīng)該合理的考慮 private、protected、default 等可見級別

12、。參數(shù)與返回值1. 實際上對外可見的方法的參數(shù)和返回值類型應(yīng)使用接口,而不是某一個具體的實現(xiàn)類。如:使用 List, Map 會比使用 ArrayList, HashMap 更合適;2. 參數(shù)的個數(shù)建議不超過 6 個。當(dāng)多于 6 個時,應(yīng)考慮是否把一部分或全部參數(shù)包裝成一個具有特定含義的對象更合適;3. 一定要驗證實際上對外可見的方法的參數(shù),如果驗證失敗會導(dǎo)致拋出異常,則應(yīng)該在方法注釋中說明在何種情況下會拋出何種異常;4. 如果調(diào)用方幾乎總要將輸入放入數(shù)組,則不要使用 varargs 形式的參數(shù)。局部(本地)變量1. 盡量在第一次使用局部變量的前一行進(jìn)行聲明(使用時聲明);2. 保證局部變量有

13、最小的作用域(作用域最小化);3. 每一個局部變量,只行使單一的職責(zé),盡量避免一個局部變量,連續(xù)承載不同含義的數(shù)據(jù)。語句1. 一行只寫一條語句,不允許把多條語句(即使很短)寫在一行中;2. 盡量避免寫過長的代碼行(為了避免還要動用左右滾動條才能看到一行代碼的完整內(nèi)容);3. 盡量避免編寫連續(xù)的對象調(diào)用的語句(如 map.get(key).doXxx() ),如果需要在對象上獲取對象后繼續(xù)操作,要確?;驒z查對象不是空引用,以避免產(chǎn)生空指針異常;4. 盡量避免編寫整合的自增/減操作。注釋Java 中的注釋主要有兩類,一類是文檔注釋,另一類是代碼注釋。文檔注釋指的是程序?qū)ν夤_的所有內(nèi)容的使用說明或

14、功能描述及相關(guān)細(xì)節(jié)闡述,也可以被叫作 API 注釋。代碼注釋主要是指文檔注釋之外的用于說明代碼執(zhí)行原理或所表示的信息等內(nèi)容的相關(guān)說明,一般出現(xiàn)在局部(字段上的說明,或方法內(nèi)部的說明等)。兩類 注釋的最大區(qū)別在于,文檔注釋可用于生成程序的 API 說明文檔,可以脫離源代碼獨立使用;而代碼注釋只對特定的源代碼進(jìn)行必要的說明,一般只出現(xiàn)在源程序代碼中,不單獨出現(xiàn)。 更新代碼時要保持注釋同步更新。 文檔注釋文檔注釋的語法結(jié)構(gòu)支持多行注釋內(nèi)容,起始標(biāo)記為 "/*", 結(jié)束標(biāo)記為 "/" (均不含引號)。注釋內(nèi)容與起始標(biāo)記以及注釋內(nèi)容和結(jié)束標(biāo)記間

15、都保留一個空格,所有的注釋行上下相連,中間不穿插其它內(nèi)容,且整個注釋內(nèi)容直接出現(xiàn)在被注 釋元素之上,注釋與被注釋的元素之間也不穿插其它內(nèi)容(Java 5 引入的 Annotation 不算)。關(guān)于文檔注釋的編寫,可參考 How to Write Doc Comments for the Javadoc Tool or Javadoc.代碼注釋1. 代碼中應(yīng)該適當(dāng)增加注釋,注釋和空行都是程序代碼的重要組成部分。注釋要能夠說明程序的含義和算法,簡明扼要,但不要過多過濫;2. 注釋的縮進(jìn)要與代碼對齊;3. 對注釋要做嚴(yán)格地拼寫檢查,保證措辭、語法、標(biāo)點符號都正確地使用,

16、保證語句通順,易于理解,避免產(chǎn)生歧義或混亂;4. 一目了然的語句不加注釋。格式給出代碼格式的,請嚴(yán)格按照給定格式編寫相關(guān)的代碼。尤其是其中的花括號與空格,不能被省略或不寫。換行符統(tǒng)一使用 Unix 換行符('n'),不允許使用其它平臺相關(guān)的換行符。字符編碼統(tǒng)一使用 UTF-8, 不允許使用其它字符集??s進(jìn)與空行1. 縮進(jìn)以4個英文半角空格字符為合適的寬度,嚴(yán)禁4個空格符寬度以外的縮進(jìn)長度;2. 代碼中應(yīng)該在合適的位置留有空行,空行也是程序代碼的重要組成部分,空行用于分隔代碼內(nèi)部的邏輯塊,分割類的各個成員,以一行為佳;3. 在運(yùn)算符和操作數(shù)之間保留一個空格(單目運(yùn)算符可例外)。花

17、括號配對1. 左花括號("")與代碼塊起始語句或關(guān)鍵詞在同一行,且括號前保留一個空格;右花括號("")獨占一行,并和括號外的代碼對齊;2. 花括號中只有一行代碼的時候,也保留花括號。分支語句if-else/ only ifif (condition_expression) statements; / if-elseif (condition_expression) statements; else statements_otherwise; / multi-branch 1 if (condition_expression_1) statements_1

18、; elseif (condition_expression_2) statements_2; elseif (condition_expression_n) statements_n; else / optional statements_otherwise; / multi-branch 2 if (condition_expression_1) statements_1; return result_1; if (condition_expression_2) statements_2; return result_2; if (condition_expression_3) state

19、ments_3; return result_3; statements_otherwise; return result_otherwise; 在多路轉(zhuǎn)移(multi-branch)中,應(yīng)該把出現(xiàn)幾率越高的條件分支排得越靠前。 switch/ 其中的 enum 不只是指 Java 中的 enum 類型,而是邏輯概念上的一組可枚舉的值。 switch (enum_variable) case enum_value_1: statements_1; break; case enum_value_2: statements_2; break; case enum_value_n

20、: statements_n; break; default: statements_otherwise; break; switch (enum_variable) case enum_value_1: statements_1; break; case enum_value_2: statements_2; break; case enum_value_n: statements_n; break; default: statements_otherwise; break; switch (enum_variable) case enum_value_1: statements_1; re

21、turn result_1; case enum_value_2: statements_2; return result_2; case enum_value_n: statements_n; return result_n; default: statements_otherwise; return result_otherwise; switch (enum_variable) case enum_value_1: statements_1; return result_1; case enum_value_2: statements_2; return result_2; case e

22、num_value_n: statements_n; return result_n; default: statements_otherwise; return result_otherwise;  - 任何情況下,switch 語句中的 default 分支都不能被省掉,而且要出現(xiàn)在所有分支的最后;- 其它 case 分支按出現(xiàn)幾率從大到小自上而下地依次排列。 循環(huán)語句for/ c 表示集合和數(shù)組 / c.size() 表示 c 中元素的個數(shù) for (int i = 0; i < c.size(); i+) / 如果性能敏感,可考慮 for (int i = 0

23、, count = c.size(); i < count; +i) statements_handling_ci; for (int i = c.size() - 1; i >= 0; i-) statements_handling_ci; for (T t : c) statements_handling_t; while 和 do-whilewhile (condition_expression) statements; do statements; while (condition_expression);其它常用語句try-catch-finallytry stateme

24、nts; / 可能拋出異常 XxxException catch (XxxException e) statements_handling_e; / 處理異常的語句,一般不能為空(什么都不寫),也不能只是 throw e,也不能是 e.printStackTrace(); finally / 可選,視情況而定 statements; / 處理資源回收等事宜 / catch 塊與 finally 塊根據(jù)實際情況不一定會都有,但 catch 和 finally 至少會有一個。synchronizedsynchronized (instance_of_reference_type) statemen

25、ts;  instance_of_reference_type 是一個引用類型的實例,推薦使用 java.lang.Object 類的實例。這里 instance_of_reference_type 一定不能是字符串、類型實例(由 類.class 獲取到的值)、類似于類型實例的會用于程序全局的單實例對象,以及在使用過程中會發(fā)生對象切換的變量等。synchronized (this) 是一種不推薦的做法,應(yīng)該盡量避免,除非總是希望內(nèi)部代碼與外部使用程序阻塞到一塊兒去。 代碼設(shè)計原則可見性與密封性在面向?qū)ο蠹夹g(shù)出現(xiàn)之前,對數(shù)據(jù)的封裝理念就已經(jīng)很流行。面向?qū)ο蠹夹g(shù)又把這一理念推向

26、了更高的高度??梢娦耘c密封性就是封裝概念中涉及到的兩個十分重要的概念??梢娦栽?Java 中被叫做“可訪問級別”。Java 提供了四個不同級別的可訪問性,分別是 private, default, protected, public.良 好的編程實踐,都會特別注意代碼的可見性,為不同的內(nèi)容指定相應(yīng)的可訪問級別。我們需要堅持的規(guī)則是,良好的設(shè)計代碼,公開的 API 使用合適的公開訪問級別,實現(xiàn)代碼及其它內(nèi)容盡量封裝在包內(nèi)部,使其對外不可見,優(yōu)先考慮 private, 如果需要包內(nèi)可見,則應(yīng)考慮 default. 選擇的依據(jù)是可見性要盡量的低,公開的內(nèi)容越少,對外的責(zé)任就越小,模塊之間的耦合度也就

27、越小。而需要對外公開的內(nèi)容,則需要花大力氣好好捉摸清楚,盡量 保證接口的穩(wěn)定性、含義準(zhǔn)確性、邏輯完整性及一致性。密封性是面向?qū)ο蟠a封裝理論中另一個重要的概念。主要是指對程序擴(kuò)展者修改或擴(kuò)展原程序行為的限制。比如,把一個類做成密封的,則這個類就不可以再被擴(kuò)展;把一個方法做成密封的,擴(kuò)展類就不能重寫這個方法。Java 提供密封性特點的關(guān)鍵字是 final.允許擴(kuò)展(繼承)只應(yīng)該出現(xiàn)在程序特定的設(shè)計目的中,如果程序設(shè)計的目的中并沒有考慮擴(kuò)展性,則一律把相應(yīng)的代碼全做成密封的。方法參數(shù)的方向一般情況下,方法的參數(shù)都是“傳入(in)”,方法的結(jié)果采用返回值(return)的方式。Java 不支持像 C

28、# 語言中的“傳出(out)”參數(shù)的類似東西。方 法的設(shè)計,應(yīng)盡最大努力避免導(dǎo)致修改方法的輸入?yún)?shù)的狀態(tài)的情況。比如,設(shè)計了一個方法,其傳入?yún)?shù)是一個自定義類型的對象,輸出是一個整數(shù)。那么如果想 返回多于一個整數(shù)的數(shù)據(jù),在 Java 中就不好做到了。這時,有人會靈機(jī)一動,通過“傳入”的對象的某個字段把想要的內(nèi)容帶出去。這里想說的就是,方法的設(shè)計要盡最大努力避免這種情況的出現(xiàn)。 這種情況,可考慮方法的返回值使用一個具有良好定義的對象。特殊地,有一類函數(shù),是為了向數(shù)組或集合中裝填數(shù)據(jù)或重排其中元素的順序,又或者是對其中的數(shù)據(jù)進(jìn)行過濾,而數(shù)組或集合的實例是由函數(shù)的調(diào)用者傳遞過來的,這種情況下,函數(shù)的

29、實現(xiàn)向傳入的數(shù)組或集合中追加數(shù)據(jù),重排其中元素的順序,或?qū)ζ渲械臄?shù)據(jù)進(jìn)行過濾的設(shè)計是合適的。常量 這里所說的常量,是一種狹義上的常量,特指由 static final 修飾的基本類型(Java 共定義了 8 種基本類型)的變量。 需要特別注意的一點是“公開的(可訪問級別為 public 以及 protected 的,概括起來,就是可被本程序集外的程序訪問的)”常量的定義需要十分的謹(jǐn)慎。對于“非公開的”常量,我們鼓勵使用。但對于“公開的”常量,情況要復(fù)雜得多,而這一點往往會被忽略(或無視)。被定義為“公開的”常量需要有以下幾個必需的特點:1. 定義出來的常量永遠(yuǎn)不會被去掉;2

30、. 定義出來的常量永遠(yuǎn)不會被修改;3. 定義出來的常量的含義永遠(yuǎn)不會發(fā)生變化。如果一個“常量”不具備以上所有特點,則不應(yīng)該定義成“公開的”。只讀與狀態(tài)狀態(tài)由數(shù)據(jù)來體現(xiàn),而數(shù)據(jù)在 Java 中主要是通過“變量”來存儲的。Java 的變量允許被定義為“只讀的”,只讀的變量的值在運(yùn)行時除初始化外是不允許被修改的(編譯器保證)。一般地,如果一個對象沒有任何數(shù)據(jù)(字段),則我們說這個對象是“無狀態(tài)的”。如果一個對象的數(shù)據(jù)在任何情況下都不會發(fā)生改變,則我們說這個對象是“狀態(tài)不可變的”。無狀態(tài)對象可視為狀態(tài)不可變對象的一個特例。狀態(tài)不可變對象可安全地用于多線程環(huán)境,不會出現(xiàn)數(shù)據(jù)錯誤及混亂問題。如果一個對象的

31、狀態(tài)是可變的,又需要用于多線程環(huán)境,那么對這個對象的訪問就需要做同步控制(Java 提供的鎖機(jī)制,或程序開發(fā)者自己實現(xiàn)的控制策略等)。在“單實例”或“多實例”模式中,請優(yōu)先考慮把對象做成“無狀態(tài)的”或“狀態(tài)不可變的”。一 般地,“無狀態(tài)對象”與“靜態(tài)類”之間最大的區(qū)別在于,“無狀態(tài)對象”可以實現(xiàn)接口,方便做集成,也方便隱藏自己的實現(xiàn)類;而“靜態(tài)類”更多地用于定義一 些通用性的“工具”。如果需要實現(xiàn)特定的接口,肯定是選擇定義成無狀態(tài)對象;如果要提供的功能更像是一些通用性的“工具”,則應(yīng)該優(yōu)先考慮定義成“靜態(tài) 類”;其它情況則應(yīng)視具體情況而定,如果不需要實現(xiàn)特定接口,而又考慮性能問題,則推薦優(yōu)先考

32、慮“靜態(tài)類”。靜態(tài)變量不推薦使用。如果確實有需要,則應(yīng)優(yōu)先考慮定義為“只讀的”。如果是引用類型的,則還應(yīng)該盡量是“狀態(tài)不可變的”對象。如果不是只讀的不可變的數(shù)據(jù),則要么保證其處在單線程環(huán)境中,要么保證對其的訪問做了“同步控制”。這些控制統(tǒng)一應(yīng)該由變量定義者來保證,而不是變量使用者。靜態(tài)方法推薦使用。只要是能定義成靜態(tài)的方法,就盡量定義成靜態(tài)的。靜態(tài)類推薦使用。合理使用異常1. 用拋出異常代替返回錯誤代碼(錯誤碼適合系統(tǒng)間調(diào)用);2. 不要在不恰當(dāng)?shù)膱龊舷乱l(fā)異常,不要對正常控制流使用異常。除了系統(tǒng)故障及可能導(dǎo)致爭用狀態(tài)的操作之外,框架設(shè)計人員還應(yīng)設(shè)計一些 API 以便用戶可以編寫不引發(fā)異常的代

33、碼??梢蕴峁┮环N在調(diào)用成員之前檢查前提條件的方法,以便用戶可以編寫不引發(fā)異常的代碼;3. 不要根據(jù)某一選項的值來確定引發(fā)或不引發(fā)異常;4. 重新引發(fā)異常時使用 Inner Exception (cause);5. 要捕捉特定的異常,而不是一般的異常;6. 避免嵌套捕捉異常;7. 避免“吃掉”異常,即捕捉了異常卻什么也不做;8. 避免無用的異常捕獲,即捕捉到異常后,只是把異常又拋了出去,其它什么都沒做,這是不應(yīng)該出現(xiàn)的做法;9. 對于可能引發(fā)異常的成員,可以考慮使用 Tester-Doer 模式來避免與異常相關(guān)的性能問題;10. 總是處理未捕獲的異常,這個是對于整個系統(tǒng)或者某個獨立的特定的模塊來

34、說的,而不是針對一個方法或函數(shù);11. 避免在 finally 內(nèi)編寫無效代碼;12. 方法在何種情況下會拋出何種異常也是方法對外“接口”的一部分。字符集問題Java 支持多語言和多種字符編碼。使用 Java 處理字符或字符串,請遵循以下原則:1. 不使用缺省字符集(編碼);2. 不使用 Java 提供的任何使用缺省字符集(編碼)的接口、類或方法;3. 顯示指明使用的字符集(編碼),優(yōu)先考慮 UTF-8;4. 系統(tǒng)對接程序需要協(xié)商使用的字符集(編碼),且顯式指明使用的字符集(編碼),優(yōu)先考慮 UTF-8.合理注釋本節(jié)所說的注釋一律指文檔注釋。注釋的必要性程 序?qū)ν馓峁┑慕涌冢◤V義的接口含義,指

35、程序向外公開的所有內(nèi)容)表明了其對外所做的承諾,承諾一旦做出,就不能再輕易或隨便修改。文檔注釋就相當(dāng)于是這份 承諾的契約,所以文檔注釋應(yīng)準(zhǔn)確的描述程序?qū)ν獾乃谐兄Z(涉及承諾的任何一個細(xì)節(jié)),不能出現(xiàn)含糊不清或模棱兩可的內(nèi)容,且一經(jīng)發(fā)布便不能再輕易的修 改。程序提供者應(yīng)為做出的承諾負(fù)全責(zé)。如果承諾被修改了(契約肯定也要做相應(yīng)的修改),則修改者應(yīng)為因此而導(dǎo)致的所有后果負(fù)責(zé),并為新改出來的承諾負(fù)全 責(zé)。· 必須添加注釋的元素簡單的說就是程序?qū)ν夤_的所有內(nèi)容。反映在 Java 中,主要是指那些被 public 以及 protected 所修飾的內(nèi)容。· 建議添加注釋的元素必須添加注釋的元素之外的其它元素,比如 default 的和 private 的,也應(yīng)該盡量添加注釋,以說明內(nèi)部 API 的設(shè)計承諾,方便后期維護(hù)。注釋成分的最小集上 一小節(jié)中指出,文檔注釋是對程序向外所做承諾的完整而準(zhǔn)確的描述,所以應(yīng)

溫馨提示

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

評論

0/150

提交評論