Java開發(fā)規(guī)范V12_第1頁
Java開發(fā)規(guī)范V12_第2頁
Java開發(fā)規(guī)范V12_第3頁
Java開發(fā)規(guī)范V12_第4頁
Java開發(fā)規(guī)范V12_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、軟件開發(fā)項目管理培訓 Java開發(fā)規(guī)范Java Development Specification版本 1.2編寫人:編寫時間:校對人:校對時間:復查人:復查時間:批準人:批準時間:修訂歷史記錄日期版本變更說明2010-5-101.0完成編碼規(guī)范制定2010-9-11.1增加了第12章安全編碼規(guī)范2011-6-11.2重新完善部分內(nèi)容并增加了JSP規(guī)范目錄第1章 緒論11.1 目的11.2 范圍11.3 版權(quán)聲明11.4 參考資料11.5 概述1第2章 代碼組織與風格22.1 基本原則22.2 縮進22.3 長度32.4 行寬32.5 間隔32.6 對齊42.7 括號52.8代碼風格5第3章

2、注釋63.1 基本原則63.2 JavaDoc63.3 文件與包注釋63.4 類、接口注釋73.5 方法注釋83.6 其他注釋93.7 注釋參考表9第4章 命名114.1 基本原則114.2 文件、包124.3 類、接口124.4 字段124.5 方法134.6 異常144.7 命名約定表15第5章 聲明175.1 基本原則175.2 包175.3 類、接口175.4 方法185.5 字段定義語法規(guī)范195.6 示例20第6章 類與接口216.1 基本原則216.2 抽象類與接口226.3 繼承與組合226.4 構(gòu)造方法和靜態(tài)工廠方法226.5 toString(),equals(),hash

3、Code().23第7章 方法257.1 基本原則257.2 參數(shù)和返回值26第8章 表達式與語句278.1 基本原則278.2 控制語句278.3 循環(huán)語句29第9章 錯誤與異常299.1 基本原則299.2 已檢查異常與運行時異常309.3 異常的捕捉與處理31第10章 測試與Bug跟蹤3110.1 基本原則3110.2 測試驅(qū)動開發(fā)3210.3 Junit單元測試3210.4 自動測試與持續(xù)集成3210.5 Bug跟蹤和缺陷處理33第11章 性能3311.1 基本原則3311.2 String與StringBugffer3311.3 集合3411.4 對象3411.5 同步3511.6

4、final3511.7 垃圾收集和資源釋放35第12章 安全隱患及預防措施3612.1 會話標識未更新3612.2 不充分帳戶封鎖3812.3 可預測的登錄憑證4012.4 登錄錯誤消息憑證枚舉4112.5 已解密的登錄請求4212.6 SQL 注入4512.7 跨站點腳本攻擊5212.8 跨站點請求偽造5312.9 數(shù)據(jù)庫錯誤模式5512.10 應用程序錯誤5612.11高速緩存的頁面5812.12 HTML注釋敏感信息泄露5912.13 文件的替代版本6012.14應用程序測試腳本6112.15客戶端的(JavaScript)Cookie 引用6212.16 BEA WebLogic 管理

5、界面63第13章 JSP開發(fā)規(guī)范6513.1目錄結(jié)構(gòu)6513.2文件命名6613.3基本原則67 軟件開發(fā)項目管理培訓 Java 開發(fā)規(guī)范第1章 緒論 1.1 目的 本規(guī)范的目的是使本組織能以標準的、規(guī)范的方式設(shè)計和編碼。通過建立編碼規(guī)范,以使每個開發(fā)人員養(yǎng)成良好的編碼風格和習慣;并以此形成開發(fā)小組編碼約定,提高程序的可靠性、可讀性、可修改性、可維護性和一致性等,增進團隊間的交流,并保證軟件產(chǎn)品的質(zhì)量。 1.2 范圍 本規(guī)范適用于其下所有軟件項目、產(chǎn)品等的設(shè)計、開發(fā)以及維護、升級等。 本規(guī)范適用于所有軟件開發(fā)人員,在整個軟件開發(fā)過程中必須遵循此規(guī)范。 1.3 版權(quán)聲明 1.4 參考資料 Jav

6、a 編程指南 Sun Java語言編碼規(guī)范 Effictive Java 1.5 概述 對于代碼,首要要求它必須正確,能夠按照設(shè)計預定功能去運行;第二是要求代碼必須清晰易懂,使自己和其他的程序員能夠很容易地理解代碼所執(zhí)行的功能等。然而,在實際開發(fā)中,每個程序員所寫的代碼卻經(jīng)常自成一套,很少統(tǒng)一,導致理解困難,影響團隊的開發(fā)效率及系統(tǒng)的質(zhì)量等。因此,一份完整并被嚴格執(zhí)行的開發(fā)規(guī)范是非常必須的,特別是對軟件公司的開發(fā)團隊而言。最根本的原則: 代碼雖然是給機器運行的,但卻是給人讀的! 運用常識。當找不到任何規(guī)則或指導方針,當規(guī)則明顯不能適用,當所有的方法都失效時, 運用常識并核實這些基本原則。這條規(guī)

7、則比其它所有規(guī)則都重要。常識是必不可少。 當出現(xiàn)該情況時,應當及時收集并提交,以便對本規(guī)范進行修改。 第2章 代碼組織與風格 2.1 基本原則 代碼的組織和風格的基本原則是:便于自己的開發(fā),易于與他人的交流。 因個人習慣和編輯器等可以設(shè)置和形成自己的風格,但必須前后一致,并符合本規(guī)范的基本要求和原則。 本章所涉及到的內(nèi)容一般都可在Java集成編輯環(huán)境中進行相應設(shè)置,也可由Ant等調(diào)用check style等來進行自動規(guī)整。 2.2 縮進 子功能塊當在其父功能塊后縮進。 當功能塊過多而導致縮進過深時當將子功能塊提取出來做為子方法。 代碼中以TAB(4個字符)縮進,在編輯器中請將TAB設(shè)置為以空格

8、替代,否則在不同編輯器或設(shè)置下會導致TAB長度不等而影響整個程序代碼的格式。例如: 縮進示例 :public void methodName() if(some condition) for() /some sentences /end for /end if 2.3 長度 為便于閱讀和理解,單個方法的有效代碼長度當盡量控制在100行以內(nèi)(不包括注釋行),當一個功能模塊過大時往往造成閱讀困難,因此當使用子方法等將相應功能抽取出來,這也有利于提高代碼的重用度。 單個類也不宜過大,當出現(xiàn)此類情況時當將相應功能的代碼重構(gòu)到其他類中,通過組合等方式來調(diào)用,建議單個類的長度包括注釋行不超過1500行。

9、盡量避免使用大類和長方法。 2.4 行寬 頁寬應設(shè)置為80字符。一般不要超過這個寬度, 這會導致在某些機器中無法以一屏來完整顯示, 但這一設(shè)置也可以靈活調(diào)整。在任何情況下, 超長的語句應該在一個逗號后或一個操作符前折行。一條語句折行后, 應該比原來的語句再縮進一個TAB或4個空格,以便于閱讀。 2.5 間隔 類、方法及功能塊間等應以空行相隔,以增加可讀性,但不得有無規(guī)則的大片空行。 操作符兩端應當各空一個字符以增加可讀性。 相應獨立的功能模塊之間可使用注釋行間隔,并標明相應內(nèi)容,具體參看附錄的代碼示例 。2.6 對齊 關(guān)系密切的行應對齊,對齊包括類型、修飾、名稱、參數(shù)等各部分對齊。 連續(xù)賦值時

10、當對齊操作符。 當方法參數(shù)過多時當在每個參數(shù)后(逗號后)換行并對齊。 當控制或循環(huán)中的條件比較長時當換行(操作符前)、對齊并注釋各條件。 變量定義最好通過添加空格形成對齊,同一類型的變量應放在一起。如下例所示: 對齊示例 :/變量對齊- int count = 100; int length = 0; String strUserName = null; Integer porductCode = new Integer(2); /產(chǎn)品編碼數(shù)組 /參數(shù)對齊- public Connection getConnection(String url, String userName, String

11、password) throws SQLException,IOException /換行對齊- public final static String SQL_SELECT_PRODUCT = “SELECT * “ + “ FROM TProduct WHERE Prod_ID = ” + prodID; /條件對齊- if( Condition1 /當條件一 && Condition2 /并且條件二 | Condition3) /或者條件三 for(int i = 0; i < productCount.length; /循環(huán)終止條件 i+) 2.7 括號 中的語句應

12、該單獨作為一行,左括號""當緊跟其語句后,右括號""永遠單獨作為一行且與其匹配行對齊,并盡量在其后說明其匹配的功能模塊。 較長的方法以及類、接口等的右括號后應使用/end .等標識其結(jié)束。如: 類的結(jié)束符:/EOC ClassName, 方法結(jié)束符:/end methodName(), 功能塊結(jié)束:/end if.userName is null? 循環(huán)快結(jié)束:/end for.every user in userList 不要在程序中出現(xiàn)不必要的括號,但有時為了增加可讀性和便于理解,當用括號限定相應項。 左括號是否換行等隨個人習慣而定,若換行則當與其前

13、導語句首字符對齊。 2.8代碼風格項目原則縮進代碼中以TAB(4個字符)縮進長度單個方法的有效代碼長度當盡量控制在100行以內(nèi);單個類的長度包括注釋行不超過1500行行寬頁寬應該設(shè)置為80字符間隔類、方法及功能塊間等應以空行(1行)相隔,但不得有無規(guī)則的大片空行;操作符兩端應當各空一個字符對齊關(guān)系密切的行應對齊,對齊包括類型、修飾、名稱、參數(shù)等各部分對齊括號左括號""當緊跟其語句后,右括號""永遠單獨作為一行且與其匹配行對齊,并盡量在其后說明其匹配的功能模塊第3章 注釋 3.1 基本原則 l 注釋應該增加代碼的清晰度。代碼注釋的目的是要使代碼更易于被其他

14、開發(fā)人員等理解。 l 如果你的程序不值得注釋,那么它很可能也不值得運行。 l 避免使用裝飾性內(nèi)容。 l 保持注釋的簡潔。 l 注釋信息不僅要包括代碼的功能,還應給出原因。 l 不要為注釋而注釋。 l 除變量定義等較短語句的注釋可用行尾注釋外,其他注釋當避免使用行尾注釋。 3.2 JavaDoc 對類、方法、變量等的注釋需要符合JavaDoc規(guī)范,對每個類、方法都應詳細說明其功能、條件、參數(shù)等,并使用良好的HTML標記格式化注釋,以使生成的JavaDoc易閱讀和理解。 3.3 文件與包注釋 在每個文件、包的頭部都應該包含該文件的名稱、版本、版權(quán)以及創(chuàng)建、修改記錄等。注意是/*/注釋而不是/*/J

15、avaDoc注釋。注釋結(jié)構(gòu):/* * (#)類名稱.java       版本創(chuàng)建時間 * 某人或某公司具有完全的版權(quán) * 使用者必須經(jīng)過許可 * 修改記錄:修改人、修改時間、修改內(nèi)容等 */文件注釋示例:/* = * (#)User.java 1.2 2011/06/01 * = * Copyright (c) 2011 ShengLi Oil Field Victorysoft Co.,Ltd.* () All Right Reserver.* =* This software is the confidential and pr

16、oprietary information of* ShengLi Oil Field Victorysoft Co.,Ltd.("Confidential Infomation")* You shall not disclose such Confidential Information and shall user* it only in accordance with terms of the license agreement * you entered into with VictorySoft.* =* 修改人: vseaf* 修改時間: 2011/06/15*

17、 修改內(nèi)容: * = 3.4 類、接口注釋 在類、接口定義之前當對其進行注釋,包括類、接口的目的、作用、功能、繼承于何種父類,實現(xiàn)的接口、實現(xiàn)的算法、使用方法、示例程序等。 類注釋示例 :/* * <p>字符串實用類。</p> (類描述)* * 定義字符串操作時所需要用到的方法,如轉(zhuǎn)換中文、HTML標記處理等。 * * author: vseaf(作者)* version: 1.2 (版本)*/ public class StringUtil 3.5 方法注釋 依據(jù)標準JavaDoc規(guī)范對方法進行注釋,以明確該方法功能、作用、各參數(shù)含義以及返回值等。復雜的算法用/*/在

18、方法內(nèi)注解出。 參數(shù)注釋時當注明其取值范圍等 返回值當注釋出失敗、錯誤、異常時的返回情況。 異常當注釋出什么情況、什么時候、什么條件下會引發(fā)什么樣的異常 。方法注釋示例 ;/* * 執(zhí)行查詢。 * * 該方法調(diào)用Statement的executeQuery(sql)方法并返回ResultSet *結(jié)果集。 * * param sql 標準的SQL語句 * return ResultSet結(jié)果集,若查詢失敗則返回null * throws SQLException 當查詢數(shù)據(jù)庫時可能引發(fā)此異常 */ public ResultSet executeQuery(String sql) throws

19、 SQLException /Statement和SQL語句都不能為空 if(null != stmt && !StringUtil.isEmpty(sql) /返回查詢執(zhí)行結(jié)果 return stmt.executeQuery(sql); return null; /end executeQuery()3.6 其他注釋 應對重要的變量加以注釋,以說明其含義等。 應對不易理解的分支條件表達式加注釋。不易理解的循環(huán),應說明出口條件。過長的方法實現(xiàn),應將其語句按實現(xiàn)的功能分段加以概括性說明。 對于異常處理當注明正常情況及異常情況或者條件,并說明當異常發(fā)生時程序當如何處理。 3.7

20、注釋參考表 注釋參考表 :項目 注釋內(nèi)容 參數(shù) 參數(shù)類型 參數(shù)用來做什么 約束或前提條件 示例 字段/屬性 字段描述 注釋所有使用的不變量 示例 并行事件 可見性決策 類 類的目的 已知的問題 類的開發(fā)/維護歷史、版本 注釋出采用的不變量 并行策略 編譯單元 (文件)文件名/標識信息 版權(quán)信息許可信息創(chuàng)建/修改記錄 獲取成員方法 若可能,說明為什么使用滯后初始化 接口 目的 它應如何被使用以及如何不被使用 局部變量 用處/目的 成員方法注釋 成員方法做什么以及它為什么做這個 哪些參數(shù)必須傳遞給一個成員方法 成員方法返回什么 已知的問題 任何由某個成員方法拋出的異常 可見性決策 成員方法是如何改

21、變對象的 包含任何修改代碼的歷史 如何在適當情況下調(diào)用成員方法的例子 適用的前提條件和后置條件 成員方法內(nèi)部注釋 控制結(jié)構(gòu) 代碼做了些什么以及為什么這樣做 局部變量 難或復雜的代碼 處理順序 包包的功能和用途第4章 命名 4.1 基本原則 規(guī)范的命名能使程序更易閱讀,從而更易于理解。它們也可以提供一些標識功能方面的信息,有助于更好的理解代碼和應用。 l 使用可以準確說明變量/字段/類/接口/包等的完整的英文描述符。例如,采用類似 firstName,listAllUsers 或 CorporateCustomer 這樣的名字,嚴禁使用漢語拼音及不相關(guān)單詞命名,雖然Java支持Unicode命名

22、,但本規(guī)范規(guī)定對包、類、接口、方法、變量、字段等不得使用漢字等進行命名。 l 采用該領(lǐng)域的術(shù)語。如果用戶稱他們的“客戶” (clients) 為“顧客” (customers),那么就采用術(shù)語 Customer 來命名這個類,而不用 Client。 l 采用大小寫混合,提高名字的可讀性。一般應該采用小寫字母,但是類和接口的名字的首字母,以及任何中間單詞的首字母應該大寫。包名全部小寫。 如:com.sun.usertest,其中usertest應全部小寫,不應這樣:userTestl 盡量少用縮寫,但如果一定要使用,當使用公共縮寫和習慣縮寫等,如實現(xiàn)(implement)可縮寫成impl,經(jīng)理(

23、manager)可縮寫成mgr等,具體參看附錄之常用縮寫簡表,嚴禁濫用縮寫。 l 不影響理解名稱含義的情況下,盡量避免使用長名字(最好不超過 25 個字母),對于較長單詞建議使用縮寫,并加注釋說明。l 避免使用相似或者僅在大小寫上有區(qū)別的名字。 l 避免使用數(shù)字,但可用2代替to,用4代替for等,如:go2Jsp。 4.2 文件、包 l 文件名當與其類嚴格相同,所有單詞首字母大寫。 l 包名一般以項目或模塊名命名,少用縮寫和長名,一律小寫。 l 包名按如下規(guī)則組成: 基本包.項目名.模塊名.子模塊名. 如: com.azcctl.workflow.form com.azcctl.workfl

24、ow.form.dao l 不得將類直接定義在基本包下,所有項目中的類、接口等都當定義在各自的項目和模塊包中。 4.3 類、接口 所有單詞首字母大寫。使用能確切反應該類、接口含義、功能等的詞。一般采用名詞。接口可帶I前綴或able、ible、er等后綴。抽象類加Abstract前綴。4.4 字段 l 常量 采用完整的英文大寫單詞,在詞與詞之間用下劃線連接,如:DEFAULT_VALUE l 變量和參數(shù) 對私有實例變量可使用_前綴,但在其存取方法中則應該將其前綴去掉。 l 組件/部件 應采用完整的英文描述符命名組件(接口部件),遵循匈牙利命名法則 如:btnOK,lblName。 l 集合 一個

25、集合,例如數(shù)組和矢量,應采用復數(shù)命名來表示隊列中存放的對象類型。命名應采用完整的英文描述符,名字中所有非開頭的單詞的第一個字母應大寫,適當使用集合縮寫前綴。如: Vector vProducts = new Vector(); /產(chǎn)品向量 Array aryUsers = new Array(); /用戶列表 l 神秘的數(shù) 我們在程序里經(jīng)常會用到一些量,它是有特定的含義的。例如,現(xiàn)在我們寫一個薪金統(tǒng)計程序,公司員工有50人,我們在程序里就會用50這個數(shù)去進行各種各樣的運算。在這里,50就是"神秘的數(shù)"。當別的程序員在程序里看到50這個數(shù),將很難知道它的含義,造成理解上的困難

26、。 在程序里出現(xiàn)"神秘的數(shù)"會降低程序的可讀性、可維護性和可擴展性,故規(guī)定不得出現(xiàn)此類"神秘的數(shù)"。避免的方法是把神秘的數(shù)定義為一個常量。注意這個常量的命名應該能表達該數(shù)的意義,并且應該全部大寫,以與對應于變量的標識符區(qū)別開來。例如上面50這個數(shù),我們可以定義為一個名為NUM_OF_EMPLOYEES的常量來代替。這樣,別的程序員在讀程序的時候就可以容易理解了。 l 其他 :命名時應使用復數(shù)來表示它們代表多值。如:orderItems。 4.5 方法 方法的命名應采用完整的英文描述符,大小寫混合使用:所有中間單詞的第一個字母大寫。方法名稱的第一個單詞常常

27、采用一個有強烈動作色彩的動詞。 取值類使用get前綴,設(shè)值類使用set前綴,判斷類使用is(has)前綴。 例: getName() setSarry() isLogon() 方法參數(shù)建議順序:(被操作者,操作內(nèi)容,操作標志,其他) 例:public void replace(String sourceStr, /源字串 String oldStr, /被替換字串 String newStr) /替換為字串4.6 異常 非運行時異常類名由表示該異常類型的單詞和Exception組成,如ActionException。 運行時異常類名由表示該異常類型的單詞和RuntimeException組成,

28、如ActionRuntimeException。異常實例一般使用e、ex等,在多個異常時使用該異常名或簡寫加E,Ex等組成,如 SQLEx ,ActionEx。69 4.7 命名約定表 命名約定表 :操作項 命名約定 示例 參數(shù) 使用傳遞值/對象的完整的英文描述符。 userID 字段/屬性 字段采用完整的英文描述,第一個字母小寫,任何中間單詞的首字母大寫。 firstName 布爾型的獲取成員方法 所有的布爾型獲取方法必須用單詞 is(has)做前綴。 isString() hasMoney() 類 采用完整的英文描述符,所有單詞的第一個字母大寫。 Customer 編譯單元文件 每個編譯單

29、元文件名字必須以.java結(jié)尾。而且在編譯單元的內(nèi)部,只能有一個public類,也可以沒有public類(不常見)。public類必須擁有與文件相同的名字(包括大小寫形式,但排除.java文件擴展名)。如果沒有public類,就可以隨意給編譯單元文件起名。Customer.java 部件/組件 使用完整的英文描述來說明組件的用途,將組件類型使用匈牙利命名法則作其前綴。 btnOK,cboTypeList 構(gòu)造方法 使用類名 Customer() 析構(gòu)方法 Java 沒有析構(gòu)方法,但一個對象在垃圾收集時,調(diào)用成員方法 finalize() 。 finalize() 非運行時異常類名 由表示該異常

30、類型的單詞和Exception組成 ActionException 運行時異常類名 由表示該異常類型的單詞和RuntimeException組成 ActionRuntimeException 異常實例名 通常采用字母 e 、ex表示異常。多個異常時使用異常名或其簡寫加E、Ex等構(gòu)成 e SQLEx 靜態(tài)常量字段(常量) 全部采用大寫字母,單詞之間用下劃線分隔。采用靜態(tài)常量獲取成員變量。 DEFAULT_NAME 獲取成員方法 被訪問字段名的前面加上前綴 get。 getUserName() 接口 采用完整的英文描述符說明接口封裝,所有單詞的第一個字母大寫。使用I前綴,其后使用able、ible

31、 或者 er等后綴,但這不是必需的。 IRunnable IPrompter 局部變量采用完整的英文描述符,第一個字母小寫,但不要隱藏已有字段。例如,如果有一個字段叫 firstName,不要讓一個局部變量叫 firstName。 strName,totalMoney 循環(huán)計數(shù)器通常采用字母 i,j,k 或者 counter,index i,j,k,count,index 包采用完整的英文描述符,所有單詞都小寫。 org.skyinn.quasar org.skyinn.skyhome.dao 成員方法采用完整的英文描述說明成員方法功能,第一個單詞盡可能采用一個生動的動詞,除第一個單詞外,每個

32、單詞第一個字母大寫。 openFile() addUser() 設(shè)置成員方法被訪問字段名的前面加上前綴 set。 setName() setPower() 第5章 聲明 5.1 基本原則 聲明的基本原則是遵守Java語言規(guī)范,并遵從習慣用法。 5.2 包 在導入包時當完全限制代碼所使用的類的名字,盡量少用通配符的方式,但導入一些通用包,或用到一個包下大部分類時,則可是使用通配符方式,如: import org.skyinn.quasar.services.Service; import java.util.*; 同一包中的類導入時當聲明在一起,可由編輯器自動完成此功能。 重要的包當添加注釋。

33、不同包中包含相同名字的類導入時,應寫明類全路徑。如:import com.azcctl.util.StringUtil;import com.skyinn.util.StringUtil;5.3 類、接口 類、接口定義語法規(guī)范: 可見性('abstract'|'final') Class|Interface class_name ('extends'|'implements')父類或接口名 如: public class LoginAction extends BaseAction implemnets ActionListene

34、r 5.4 方法 良好的程序設(shè)計應該盡可能減小類與類之間耦合,所遵循的經(jīng)驗法則是:盡量限制成員方法的可見性。如果成員方法沒必要公有 (public),就定義為保護 (protected);沒必要保護 (protected),就定義為私有 (private)。 方法定義語法規(guī)范: 可見性('abstract'|'final') 'synchronized'返回值類型 method_name(參數(shù)列表)('throws')異常列表 / 功能模塊 如: public List listAllUsers() throws DAOExcep

35、tion 若有toString(),equals(),hashCode(),colone()等重載自O(shè)bject的方法,應將其放在類的最后。 聲明順序: 構(gòu)造方法 靜態(tài)公共方法 靜態(tài)私有方法 受保護方法私有方法 繼承自O(shè)bject的方法5.5 字段定義語法規(guī)范 (public|private|protected)(final|volatile)statictransient data_type field_name = expression ;若沒有足夠理由,不要把實例或類變量聲明為公有。公共和保護的可見性應當盡量避免,所有的字段都建議置為私有,由獲取和設(shè)置成員方法(Getter、Setter

36、)訪問。 不允許“隱藏”字段,即給局部變量所取的名字,不可與另一個更大范圍內(nèi)定義的字段的名字相同(或相似)。例如,如果把一個字段叫做 firstName ,就不要再生成一個局部變量叫做 firstName,或者任何易混肴的名字,如 fistName。 數(shù)組聲明時當將""跟在類型后,而不是字段名后,如: Integer ai = new Integer (2); /一個整數(shù)對象數(shù)Integer aj = new Integer (3); /不要用這種數(shù)組聲明方式 一行代碼只聲明一個變量,僅將一個變量用于一件事。 聲明順序: 常量 類變量 實例變量 公有字段 受保護字段 私有字

37、段可以將私有變量聲明在類或接口的最后。 注意受保護變量、私有變量、“包”變量間的區(qū)別。5.6 示例 Table8 /常量- public final static double PI = 3.141592653589793; / -類變量 protected static String key = “Love”; / -實例變量 /共有字段- public String userName = “Tom”; /受保護字段- protected float price = 0.0; /友元字段- Vector vPorducts = null; /私有字段- private int count;

38、/構(gòu)造方法- public Constructor() /公共方法- public String getUserName() /友元方法- void createProduct() /受保護方法- protected void convert() /私有方法- private void init() /重載Object方法- public String toString() /main方法- public static void main(String args) 第6章 類與接口 6.1 基本原則 類的劃分粒度,不可太大,造成過于龐大的單個類,也不可太細,從而使類的繼承太深。一般而言,一個類

39、只做一件事;另一個原則是根據(jù)每個類的職責進行劃分,比如用User來存放用戶信息,而用UserDAO來對用戶信息進行數(shù)據(jù)訪問操作(比如存取數(shù)據(jù)庫),用UserBroker來封裝用戶信息的業(yè)務操作等等。 多使用設(shè)計模式,隨時重構(gòu)。 多個類中使用相同方法時將其方法提到一個接口中或使用抽象類,盡量提高重用度。 將不希望再被繼承的類聲明成final,例如某些實用類,但不要濫用final,否則會對系統(tǒng)的可擴展性造成影響。 將不希望被實例化的類的缺省構(gòu)造方法聲明成private。 6.2 抽象類與接口 一般而言:接口定義行為,而抽象類定義屬性和公有行為,注意兩者間的取舍,在設(shè)計中,可由接口定義公用的行為,由

40、一個抽象類來實現(xiàn)其部分或全部方法,以給子類提供統(tǒng)一的行為定義,可參考Java集合等實現(xiàn)。 多使用接口,盡量做到面向接口的設(shè)計,以提高系統(tǒng)的可擴展性。 6.3 繼承與組合 盡量使用組合來代替繼承,一則可以使類的層次不至于過深,而且會使類與類,包與包之間的耦合度更小,更具可擴展性。 6.4 構(gòu)造方法和靜態(tài)工廠方法 當需要使用多個構(gòu)造方法創(chuàng)建類時,建議使用靜態(tài)工廠方法替代這些構(gòu)造方法(參考Effictive Java Item1),例如: public class User public User() super(); /do somethings to create user instance p

41、ublic static User getInstance(String name,String password) User u = new User(); u.setName(name); u.setPassword(password); return u; 參看String,Boolean的實現(xiàn)等:String.valueOf(Longl),Boolean.valueOf(String). 6.5 toString(),equals(),hashCode(). 每個類都應該重載toString()方法,以使該類能輸出必要和有用的信息等。 /* * see java.lang.Object

42、#toString() */ public String toString() final StringBuffer sb = new StringBuffer("Actor:"); sb.append("ID = ").append(_id) .append(",Name = ").append(_name) .append(''); return sb.toString(); 若一個類需要重載equals()方法,則必須同時重載hashCode()方法實現(xiàn)方式參考Effictive JavaItem7,Item8

43、/* * see java.lang.Object#equals(java.lang.Object) */ public boolean equals (Object obj) /空值 if( null = obj) return false; /引用相等 if (obj = this) return true; /判斷是否為當前類實例 if (!(obj instanceof Actor) return false; /若ID相等則認為該對象相等 return this._id = (Actor) obj).getId (); /* * see java.lang.Object#hashCo

44、de() */ public int hashCode () int result = 17;/init result /String 對象hashCode result = (37 * result) + _name.hashCode (); /數(shù)值 result = (37 * result) + (int) (_id (_id >>> 32); /String 對象hashCode result = (37 * result) + _description.hashCode (); return result; 6.6 Singleton Class 單例類使用如下方式

45、聲明,并將其缺省構(gòu)造方法聲明成private: public class Singleton private static Singleton instance = new Singleton(); / 私有缺省構(gòu)造方法,避免被其他類實例化 private Singleton() /do something public static Singleton getInstance() if(null = instance) instance = new Singleton(); return instance; /EOC Singleton 單例類若需要實現(xiàn)序列化,則必須提供readResolv

46、e()方法,以使反序列化出來的類仍然是唯一的實例,參照Effictive Java Item57。第7章 方法 7.1 基本原則 一個方法只完成一項功能,在定義系統(tǒng)的公用接口方法外的方法應盡可能的縮小其可見性。 避免用一個類的實例去訪問其靜態(tài)變量和方法。 避免在一個較長的方法里提供多個出口: /不要使用這鐘方式,當處理程序段很長時將很難找到出口點 if(condition) return A; else return B; /建議使用如下方式 String result = null; if(condition) result = A; else result = B; return resu

47、lt; 7.2 參數(shù)和返回值 避免過多的參數(shù)列表,盡量控制在5個以內(nèi),若需要傳遞多個參數(shù)時,當使用一個容納這些參數(shù)的對象進行傳遞,以提高程序的可讀性和可擴展性。 參數(shù)類型和返回值盡量接口化,以屏蔽具體的實現(xiàn)細節(jié),提高系統(tǒng)的可擴展性,例如: public void joinGroup(List userList) public List listAllUsers()第8章 表達式與語句 8.1 基本原則 表達式和語句應當清晰、簡潔,易于閱讀和理解,避免使用晦澀難懂的語句。 每行至多包含一條執(zhí)行語句,過長當換行。 避免在構(gòu)造方法中執(zhí)行大量耗時的初始化工作,應當將這種工作延遲到被使用時再創(chuàng)建相應資源

48、,如果不可避免,則當使用對象池和Cache等技術(shù)提高系統(tǒng)性能。 避免在一個語句中給多個變量賦相同的值。它很難讀懂。 不要使用內(nèi)嵌(embedded)賦值運算符試圖提高運行時的效率,這是編譯器的工作。 盡量在聲明局部變量的同時初始化。唯一不這么做的理由是變量的初始值依賴于某些先前發(fā)生的計算。 一般而言,在含有多種運算符的表達式中使用圓括號來避免運算符優(yōu)先級問題,是個好方法。即使運算符的優(yōu)先級對你而言可能很清楚,但對其他人未必如此。你不能假設(shè)別的程序員和你一樣清楚運算符的優(yōu)先級。 不要為了表現(xiàn)編程技巧而過分使用技巧,簡單就好。 8.2 控制語句 判斷中如有常量,則應將常量置與判斷式的左側(cè)。如: i

49、f ( true = isAdmin(). if ( null = user). 盡量不使用三目條件判斷。 所有if語句必須用包括起來,即便是只有一句:if (true) /do something. if (true) i = 0; /不要使用這種 過多的else分句請將其轉(zhuǎn)成switch語句或使用子方法。 每當一個case順著往下執(zhí)行時(因為沒有break語句),通常應在break語句的位置添加注釋。如:switch (condition) case ABC: /statements; /繼續(xù)下一個CASE case DEF: /statements; break; case XYZ: /

50、statements; break; default: /statements; break; /end switch 8.3 循環(huán)語句 循環(huán)中必須有終止循環(huán)的條件或語句,避免死循環(huán)。 當在for語句的初始化或更新子句中使用逗號時,避免因使用三個以上變量,而導致復雜度提高。若需要,可以在for循環(huán)之前(為初始化子句)或for循環(huán)末尾(為更新子句)使用單獨的語句。 因為循環(huán)條件在每次循環(huán)中多會執(zhí)行一次,故盡量避免在其中調(diào)用耗時或費資源的操作,比較一下兩種循環(huán)的差異: /不推薦方式_ while(index < products.getCount() /每此都會執(zhí)行一次getCount()方法, /若此方法耗時則會影響執(zhí)行效率 /而且可能帶來同步問題,若有同步需求,請使用同步塊或同步方法 /推薦方式_ /將操作結(jié)構(gòu)保存在臨時變量里,減少方法調(diào)用次數(shù) final int count = products.getCount(); while(

溫馨提示

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

評論

0/150

提交評論