[計算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范
《[計算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范》由會員分享,可在線閱讀,更多相關(guān)《[計算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范(47頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 Java開發(fā)規(guī)范 Aostar & YinHai 開發(fā)管理 文件編號: 文件名稱: Java開發(fā)規(guī)范 版 本 號 日期: 項目名稱 項目編號: 項目負(fù)責(zé)人 立項日期: 修訂歷史記錄 日期 版本號 作者 說明 2009-6-25 V1.0 王流一 目 錄 第1章 序言 3 第2章 java一般性研發(fā)規(guī)范 5 2.1 代碼格式 5 2.1.1 包、類、方法的命名規(guī)范: 5
2、2.1.2 方法的命名應(yīng)注意避免與java中具有特殊意義的名稱例如equals,hashCode,clone,finalizer等沖突 7 2.1.3 Java bean中取得boolean類型的屬性值必須使用is****形式命名 8 2.1.4 if,else,while,for等必須使用{} 9 2.1.5 類必須包含在包里,禁止出現(xiàn)無包的類 10 2.1.6 類和方法必須擁有注釋,注釋量占總體代碼25%以上,類頭部,以及方法頭部的注釋應(yīng)符合javadoc標(biāo)準(zhǔn)。 10 2.2 基本語法 11 2.2.1 不能隨意捕捉異常,原則上誰捕捉誰處理 11 2.2.2 if,while
3、,try,finally,switch , synchronized , static instantiation 里面應(yīng)有相應(yīng)的邏輯處理,不能為空。 12 2.2.3 在處理循環(huán)中,不能在程序中人為的改變步長。 13 2.2.4 將簡單類型int,short,float,double等轉(zhuǎn)化成字符串時,需使用其對應(yīng)類的toString方法。 13 2.2.5 javaBean中hashCode,以及equals方法必須同時override。 14 2.2.6 懶式方式創(chuàng)建對象:不能采用雙檢查慣用法 17 2.2.7 不能在finally中返回值。 18 2.2.8 Boolean實
4、例化時,應(yīng)用使用Boolean.valueOf,Boolean.TRUE,Boolean.FALSE。 19 2.2.9 Integer,Byte,Short,Long等實例化時,應(yīng)用使用valueOf 19 2.2.10 對于多個if語句嵌套的情況下能夠整合盡量整合。 20 2.2.11 override function,不能只有super.function語句,否則視為無效代碼 20 2.2.12 Collection.toArray的注意事項。 21 2.2.13 對于BigDecimal方法,應(yīng)避免使用float值,double值進(jìn)行創(chuàng)建,應(yīng)使用字符串形式創(chuàng)建。 21 2
5、.2.14 String,BigDecimal,BigInteger等值類型調(diào)用replace,add等方法的注意事項。 22 2.2.15 需要注意的引起NullException的語句。 22 2.2.16 ResultSet使用next時,需要判斷是否具有記錄再進(jìn)行一下步操作。 24 2.2.17 字符串使用相應(yīng)的規(guī)則。 25 2.2.18 禁止直接調(diào)用System.gc(),System.getRuntime().gc(),System.runFinalization()。 26 2.2.19 finalize相應(yīng)的規(guī)則。 27 2.2.20 禁止在代碼中使用System.
6、out,ex.printStackTrace打印日志。 27 2.2.21 系統(tǒng)資源釋放(誰創(chuàng)建的,誰關(guān)閉) 28 2.2.22 使用Clone時相應(yīng)的規(guī)則。 32 2.2.23 java Bean類必須實現(xiàn)Serialize接口。 32 2.2.24 比較對象相等應(yīng)使用equals,而不是==。 32 2.2.25 Array數(shù)組拷貝應(yīng)使用System.arrayCopy。 33 2.3 耦合性以及設(shè)計 33 2.3.1 switch語句必須包含default標(biāo)簽。 33 2.3.2 精簡boolean表達(dá)式以及boolean返回值。 34 2.3.3 在方法實現(xiàn)中應(yīng)避免對
7、輸入的值參進(jìn)行改變。 35 2.3.4 在創(chuàng)建方法中,應(yīng)避免調(diào)用被override的方法 35 2.3.5 public static常量屬性必須final。 36 2.3.6 Abstract 類必須含有abstract方法。 37 2.3.7 接口依賴性。 37 2.4 代碼質(zhì)量因素 38 2.4.1 Class代碼行數(shù)限制 38 2.4.2 函數(shù)代碼質(zhì)量 38 第3章 java安全性檢查規(guī)范 40 3.1 跨站腳本XSS 40 3.2 違反信任邊界規(guī)則(Trust Boundary Violation) 41 3.3 不安全的反射(Unsafe Reflection
8、) 42 3.4 SQL 注入(SQL Injection) 43 3.5 系統(tǒng)信息泄露(System Information Leakage) 44 3.6 資源注入(resource injection) 45 第1章 序言 本規(guī)范的目的在于:建立一個可行可操作的編程標(biāo)準(zhǔn)、約定和指南,以規(guī)范公司java代碼研發(fā)工作。 2009年為公司的質(zhì)量年,為了提高公司研發(fā)能力,該規(guī)范的制定是為了規(guī)范java代碼開發(fā),提高java開發(fā)質(zhì)量,從代碼的層面規(guī)范并提高java項目的研發(fā)水平。該規(guī)范由運(yùn)營中心技術(shù)小組制定,運(yùn)營中心技術(shù)小組將結(jié)合PMD檢查工具以及相應(yīng)的檢查工具,組織技術(shù)監(jiān)控人員
9、對重點(diǎn)項目以及新的java項目定期檢查,對代碼質(zhì)量進(jìn)行評估,對代碼質(zhì)量較差限期整改,并報運(yùn)營中心備案作為項目考核依據(jù)。 本規(guī)范適用于2009年公司java代碼研發(fā)規(guī)范。本規(guī)范的內(nèi)容包括兩個方面:java開發(fā)一般規(guī)范,以及java代碼開發(fā)安全性規(guī)范。Java代碼開發(fā)一般規(guī)范主要從java基本語法,代碼格式,耦合性以及設(shè)計方面,以及代碼質(zhì)量因子等進(jìn)行描述;java代碼開發(fā)安全性規(guī)范主要從sql注入,資源注入,跨站腳步,安全邊界違例,系統(tǒng)信息泄露進(jìn)行描述。 為了方便并配合PMD檢查工具等相應(yīng)檢查工具,方便開發(fā)者針對違規(guī)代碼進(jìn)行調(diào)整,本規(guī)范中java一般開發(fā)規(guī)范描述形式將結(jié)合PMD,并提供示例代碼
10、,其形式如下: n 規(guī)范描述: n PMD規(guī)則名稱: n PMD級別(注1): n 違規(guī)示例代碼: n 合法示例代碼: 本規(guī)范中java安全開發(fā)規(guī)范部分將結(jié)合具體項目,對出現(xiàn)安全隱患的代碼進(jìn)行分析,以及相應(yīng)的解決辦法和思路上進(jìn)行分析,其具體格式如下: n 風(fēng)險及危害: n 應(yīng)對措施: n 非安全代碼示例 n 安全代碼示例 本規(guī)范解釋權(quán)歸運(yùn)營中心技術(shù)小組,屬于運(yùn)營中心為了提供公司研發(fā)水平以及質(zhì)量的一系列措施中的一部分,在后續(xù)的版本中將根據(jù)具體需要進(jìn)行修改以及調(diào)整。 注1:PMD級別分為5級 Error high 必須修改
11、 Error 不修改的項需要進(jìn)行說明 Warning high 代碼中該項每千行代碼不能多于2%; Warning 參考 Information 參考 注2:對于Error級別需要項目組通過以下文字說明: 文件名 代碼行數(shù) 觸發(fā)PMD規(guī)則 不修改原因 技術(shù)小組審核意見 技術(shù)小組審核后給出相應(yīng)的整改意見,對于有爭議的問題,可直接與運(yùn)營中心技術(shù)小組領(lǐng)導(dǎo)成員溝通。 第2章 java一般性研發(fā)規(guī)范 2.1 代碼格式 2.1.1 包、類、方法的命名規(guī)范
12、: n 規(guī)范描述: 包,類,方法命名只能為27個英文字符以及數(shù)字,不能包括特殊字符例如-,_,$等; 包命名,首字符必須小寫; 類命名,首字符必須大寫; 方法命名,首字符必須小寫; 常量命名,必須全部大寫; 變量,以及屬性命名,首字符必須小寫; 在類中非創(chuàng)建方法其命名應(yīng)避免與類命一致; 在類中屬性的命名應(yīng)避免與類命一致; 在同一類中屬新命名應(yīng)避免與方法命名一致; 在方法中命名臨時變量時應(yīng)避免與方法的參數(shù)名一致; n PMD規(guī)則名稱: AvoidDollarSigns PackageCase ClassNamingConventions MethodNamingC
13、onventions SuspiciousConstantFieldName VariableNamingConventions MethodWithSameNameAsEnclosingClass AvoidFieldNameMatchingTypeName MisleadingVariableName n 規(guī)則級別: Error High warn High warn High warn High warn High Error High Error High Error High n 違規(guī)示例代碼: 1、 常量、變量命名 public static fi
14、nal int my_num = 0; //常量應(yīng)大寫 public String MyTest = ""; //變量命名,首字符小寫 DataModule DMTest = new DataModule();//變量命名,首字符小寫 2、 方法命名 public class Foo { public void FooStuff() { } } 3、 類命名:首字符應(yīng)大寫 public class foo {} 4、 非法使用特殊字符命名 public class Fo$o { // yikes! } 5、 非創(chuàng)建方法命名應(yīng)避免與類名一致 pub
15、lic class MyClass { // this is bad because it is a method public void MyClass() {} // this is OK because it is a constructor public MyClass() {} } 6、 方法中臨時變量的命名應(yīng)避免與其參數(shù)一致: public void bar(String m_baz) { // Bad int m_boz = 42; // Bad } 7、 在類中屬性的命名應(yīng)避免與類命一致: public class Foo extend
16、s Bar { // Theres probably a better name for foo int foo; } 8、 在同一類中屬性命名應(yīng)避免與方法命名一致: public class Foo { Object bar; // bar is data or an action or both? void bar() { } } n 合法代碼示例: 1、 常量、變量命名: public static final int MY_NUM = 0; // public String myTest = ""; DataModule dmTest
17、 = new DataModule(); 2、 方法命名:首字符應(yīng)小寫 public class Foo { public void fooStuff() { } } 3、 類命名:首字符應(yīng)大寫 public class Foo {} 2.1.2 方法的命名應(yīng)注意避免與java中具有特殊意義的名稱例如equals,hashCode,clone,finalizer等沖突 n 規(guī)范描述: 在java中某些方法是具有特殊意義的,例如boolean equals(Object o)是比較兩個對象是否相;int hashCode()取得hash值,主要用于hash表;Object
18、 clone()用于復(fù)制對象;void finalizer()用于該類實例化的對象釋放時系統(tǒng)調(diào)用釋放該對象使用的資源。這些方法具有固定的形參格式,固定的返回值,不能被其他形式或者用于其他方面的方法override,否則將降低代碼可讀性,并為代碼維護(hù)帶來隱患。 n PMD規(guī)則名稱: SuspiciousEqualsMethodName SuspiciousHashcodeMethodName; FinalizeOverloaded; BooleanGetMethodName; n 規(guī)則級別: Error High Error High Error High Error
19、High n 違規(guī)示例代碼: 1、 可疑的equals方法命名 public class Foo { public int equals(Object o) { // oops, this probably was supposed to be boolean equals } public boolean equals(String s) { // oops, this probably was supposed to be equals(Object) } } 2、 可疑的hashCode命名 public class Foo { publi
20、c int hashCode(int value) { // oops, this probably was supposed to be hashCode } } n 合法代碼示例: 1、 正確的equals方法命名 public class Foo { public boolean equals(Object o) { // oops, this probably was supposed to be boolean equals } } 2、 正確的hashCode命名 public class Foo { public int has
21、hCode() { // oops, this probably was supposed to be hashCode } } 注:一般來說override hashCode方法為了避免鍵值沖突,提高h(yuǎn)ash表的查詢效率,可采用37乘法原則,例如某javabean中包含兩個關(guān)鍵屬性str1,str2,str3該關(guān)鍵屬性不能為空,這其hash值按以下算法獲得:str1.hashCode()+str2.hashCode()*37+str3.hashCode()*37*37。 2.1.3 Java bean中取得boolean類型的屬性值必須使用is****形式命名 n 規(guī)范描述:
22、 對于java bean來說,get***是取得該bean的屬性值,set***為設(shè)置該bean的屬性值,is***是獲得該bean中為boolean類型的屬性值,這些方法對java bean來說是具有特殊意義,如果命名不規(guī)范將導(dǎo)致在使用java bean內(nèi)置方法時出現(xiàn)取值,或者設(shè)值不成功。 n PMD規(guī)則名稱: BooleanGetMethodName n 規(guī)則級別: Error High n 違規(guī)示例代碼: public boolean getFoo(); // bad n 合法代碼示例: public boolean isFoo(); // ok 2.1.
23、4 if,else,while,for等必須使用{} n 規(guī)范描述: If,else,while,for等分支循環(huán)語句,必須使用{}將業(yè)務(wù)處理邏輯包含在內(nèi),這樣可大大提高代碼可讀性,有利于后續(xù)代碼維護(hù)。 n PMD規(guī)則名稱: IfStmtsMustUseBraces WhileLoopsMustUseBraces IfElseStmtsMustUseBraces ForLoopsMustUseBraces n 規(guī)則級別: warn High n 違規(guī)示例代碼: 1、 if語句違例代碼 if (foo) x++; 2、 else語句違例代碼
24、if (foo) x++ else x--; 3、while語句違例代碼 while(x<100) x++; 4、 for語句違例代碼 for(int i=0;i<10;i++) x++; n 合法代碼示例: 1、 if語句 if (foo){ x++; } 2、 else語句 if (foo){ x++ }else{ x--; } 3、while語句 while(x<100){ x++; } 5、 for語句 for(int i=0;i<10;i++){ x++; } 2.
25、1.5 類必須包含在包里,禁止出現(xiàn)無包的類 n 規(guī)范描述: 包是java中類所在命名空間,用于類載入時,虛擬機(jī)快速定位并查找該類;如果一個無包類,在類載入時,耗時較多,并且很可能無法找到該類。 n PMD規(guī)則名稱: NoPackage n 規(guī)則級別: error High 2.1.6 類和方法必須擁有注釋,注釋量占總體代碼25%以上,類頭部,以及方法頭部的注釋應(yīng)符合javadoc標(biāo)準(zhǔn)。 n 規(guī)范描述: 注釋多少是評價代碼質(zhì)量好壞的一個標(biāo)準(zhǔn),25%是符合國際上對java注釋的標(biāo)準(zhǔn);對于類頭部注釋,方法頭部注釋符合javadoc標(biāo)準(zhǔn),可java工具自動根據(jù)源碼生成相應(yīng)的ja
26、va幫助文檔。對于類頭部注釋需要包含以下信息:該類的主用功能,作者,以及創(chuàng)建時間等信息;對于方法頭部注釋需要包含以下信息:該方法的主要功能,以及參數(shù)類型含義,返回值類型含義等等。 n 合法代碼注釋示例 1、 類頭部注釋規(guī)范 /** * 實時數(shù)據(jù)文件解析:讀取實時數(shù)據(jù)文件,對其內(nèi)容進(jìn)行解析,生成符合格式以及標(biāo)準(zhǔn)單位的數(shù)據(jù)集合 * @author wangliuyi * @version 1.0 * @since 2009-05-15 */ public class DataFileParse{ 2、 方法頭部注釋規(guī)范 /** * 判斷該時間是否在統(tǒng)計時區(qū)里面
27、* @param time long 從實時采集文件中提取的時間,該時間為格林威治時間,單位為毫秒 * @return boolean true:表示該時間在合法的時間區(qū)內(nèi) false:表示該時間不合法 */ public boolean checkStatTimeZone(long time) 3、 屬性以及方法內(nèi)部的注釋通過“//”注釋 public class GeneralStat implements IStat { //解析數(shù)據(jù)格式的分隔符號 private String separator = ","; //開始統(tǒng)計序號 private int
28、startNum = 1; 2.2 基本語法 2.2.1 不能隨意捕捉異常,原則上誰捕捉誰處理 n 規(guī)范描述: Java程序運(yùn)行過程中產(chǎn)生異常,意味著有錯誤產(chǎn)生,捕捉該異常,就需要對該異常進(jìn)行處理:例如記錄日志,事務(wù)回滾等,如果僅捕獲而不處理,人為的屏蔽異常,調(diào)用該函數(shù),可能為調(diào)用者帶來困惑,調(diào)用者極可能認(rèn)為該方法正常運(yùn)行而做出錯誤的判斷。 一般來說,異常處理機(jī)制屬于應(yīng)用程序總體框架的一部分,一個良好的異常處理機(jī)制可以避免系統(tǒng)產(chǎn)生的一些不可預(yù)測的結(jié)果,并提高代碼可讀性,可維護(hù)性,從而提高代碼的質(zhì)量。本規(guī)則要對異常處理進(jìn)行檢查,對一些捕捉后不處理,或者直接將該異常拋出等進(jìn)行預(yù)警。 n
29、 PMD規(guī)則名稱: EmptyCatchBlock n 規(guī)則級別: Warn High n 違規(guī)示例代碼: public void doSomething() { try { doSomething……; } catch (IOException ioe) { // 獲取異常后沒有做任何處理 } } n 合法代碼示例: public static int parseInt(String value, int defaultValue) { if (isNull(value)) { return
30、 defaultValue; } try { return Integer.parseInt(value.trim()); } catch (Exception ex) { //記錄日志 Log.warn(“轉(zhuǎn)換異?!?ex); //異常后返回缺省值 return defaultValue; } } 2.2.2 if,while,try,finally,switch , synchronized , static instantiation 里面應(yīng)有
31、相應(yīng)的邏輯處理,不能為空。 n 規(guī)范描述: 在if,while,try,finally,switch,synchronized,static Initializer中處理邏輯部分如果為空,很可能這段代碼無任何作用,是段廢棄的代碼,這段代碼的存在不僅對代碼維護(hù)帶來疑惑,降低了整體的代碼質(zhì)量。 n PMD規(guī)則名稱: EmptyIfStmt EmptyWhileStmt EmptyTryBlock EmptyFinallyBlock EmptySwitchStatements EmptySynchronizedBlock EmptyStaticInitializer n 規(guī)則
32、級別: Warn High n 違規(guī)示例代碼: 1. if語句中為空 if (foo){ } 2. while語句中為空 while(x<100) { } 3. try,finally中為空 try{ }finally{ } 4. switch中為空 switch(value){ } 5. synchronized中為空 synchronized(this){ } 6. static Initializer為空 static{ } 2.2.3 在處理循環(huán)中,不能在程序中人為的改變步長。 n 規(guī)范描述: 在循環(huán)中對步長變量人為的改變,很
33、有可能喪失對步長的控制,導(dǎo)致運(yùn)行時出現(xiàn)一些不可預(yù)測的結(jié)果。該規(guī)則是限制開發(fā)者對這種場景的使用,畢竟步長在多個地方改變,開發(fā)者很容易沒有考慮全面,導(dǎo)致在特殊情況下出錯。 n PMD規(guī)則名稱: JumbledIncrementer n 規(guī)則級別: Error n 違規(guī)示例代碼: 1. 上述代碼會陷入死循環(huán) public void foo() { for (int i = 0; i < 10; i++) { for (int k = 0; k < 20; i++) { System.out.println("Hello"); } }
34、 2.2.4 將簡單類型int,short,float,double等轉(zhuǎn)化成字符串時,需使用其對應(yīng)類的toString方法。 n 規(guī)范描述: 將java中簡單類型轉(zhuǎn)換成字符串時,如果采用先轉(zhuǎn)換成對應(yīng)的類型的對象,然后通過值對象轉(zhuǎn)換成字符串,該過程將產(chǎn)生兩個對象的創(chuàng)建,而直接采用對應(yīng)類型的toString方法,只產(chǎn)生一個對象的創(chuàng)建,其效率是前者的兩倍。 n PMD規(guī)則名稱: UnnecessaryConversionTemporary n 規(guī)則級別: Error High n 違規(guī)示例代碼: 1、 整形轉(zhuǎn)字符 int value=1; String v=new Inte
35、ger(value).toString(); 2、 短整形轉(zhuǎn)字符 short value=1; String v=new Short(value).toString(); 3、 浮點(diǎn)轉(zhuǎn)字符 float value=1.2f; String v=new Float(value).toString(); 4、 雙精度浮點(diǎn)轉(zhuǎn)字符 double value=1.2d; String v=new Double(value).toString(); n 合法代碼示例: 1、 整形轉(zhuǎn)字符 int value=1; String v= Integer.valueOf(value
36、); 2、 短整形轉(zhuǎn)字符 short value=1; String v= Short.valueOf( value); 3、 浮點(diǎn)轉(zhuǎn)字符 float value=1.2f; String v= Float.valueOf( value); 4、 雙精度浮點(diǎn)轉(zhuǎn)字符 double value=1.2d; String v= Double.valueOf(value; 2.2.5 javaBean中hashCode,以及equals方法必須同時override。 n 規(guī)范描述: HashCode是生成hash值,可用于hash表中主鍵的查找,equals是比較兩個對象是否相
37、等,缺省的hashCode以及equals只能針對同一引用的對象,如果為不同的引用的對象,雖然其值是相等,但使用hashCode卻是不同的值,而使用equals返回的也是false。在某些場合中,例如將某javabean對象作為hash表的主鍵值,或者判斷某對象是否在集合中,如果不實現(xiàn)hashCode,以及equals會得到不可預(yù)測的結(jié)果。 n PMD規(guī)則名稱: OverrideBothEqualsAndHashCode n 規(guī)則級別: Error High n 違規(guī)示例代碼: //該AgcDataInfo沒有override equals方法 public class A
38、gcDataInfo { Public AgcDataInfo(String planUnitNo) { if(planUnitNo!=null) this.planUnitNo = planUnitNo; } //機(jī)組名稱 String planUnitNo=””; /** * 生成hash值 */ public int hashCode() { return this.getPlanUnitNo().hashCode(); } /**自動生成get,set方法 public String
39、getPlanUnitNo() { return planUnitNo; } public void setPlanUnitNo(String planUnitNo) { if(planUnitNo!=null) this.planUnitNo = planUnitNo; } } public void main(String[] args) { Collection v=new Vector(); Map map=new Hashtable(); AgcDataInfo t1=new AgcDataI
40、nfo(“test”); AgcDataInfo t2=new AgcDataInfo(“test”); v.add(t1); map.put(t1,“test“); map.put(t2,“test“); //false而不是true System.out.println(v.contains(t2)); //2而不是1 System.out.println(map.size()); } n 合法代碼示例: public class AgcDataInfo { Public AgcDat
41、aInfo(String planUnitNo) { if(planUnitNo!=null) this.planUnitNo = planUnitNo; } //機(jī)組名稱 String planUnitNo=””; /** * 比較等式,比較值為下達(dá)時間,下達(dá)功率,機(jī)組名稱 */ public boolean equals(Object o) { if (o instanceof AgcDataInfo) { AgcDataInfo data = (AgcDataInfo) o; return his.
42、getPlanUnitNo().equals(data.getPlanUnitNo()); } return false; } /** * 生成hash值 */ public int hashCode() { return this.getPlanUnitNo().hashCode(); } /**自動生成get,set方法 public String getPlanUnitNo() { return planUnitNo; } public void setPlanUnitNo(String plan
43、UnitNo) { if(planUnitNo!=null) this.planUnitNo = planUnitNo; } } public void main(String[] args) { Collection v=new Vector(); Map map=new Hashtable(); AgcDataInfo t1=new AgcDataInfo(“test”); AgcDataInfo t2=new AgcDataInfo(“test”); v.add(t1); map.pu
44、t(t1,“test“); map.put(t2,“test“); //true System.out.println(v.contains(t2)); //1 System.out.println(map.size()); } 2.2.6 懶式方式創(chuàng)建對象:不能采用雙檢查慣用法 n 規(guī)范描述: 雙檢查一般用于c,c++懶式方式獲得資源時慣用模式,但在java中該模式是不適用的,因為java創(chuàng)建對象時,先將對象創(chuàng)建后,直接將指針賦予給變量,然后才進(jìn)行后續(xù)的初始化,在初始化這段空白期中,如果另外的線程獲得該對象的引用,調(diào)用該對象,會產(chǎn)
45、生一些不可預(yù)測的結(jié)果。 n PMD規(guī)則名稱: DoubleCheckLock n 規(guī)則級別: Error High n 違規(guī)示例代碼 public class Foo { Object baz; Object bar() { if(baz == null) { //baz may be non-null yet not fully created synchronized(this){ if(baz == null){ baz = new Object(); } }
46、 } return baz; } } n 合法代碼示例: public class Foo{ Object baz; Object bar() { synchronized(this){ if(baz == null){ baz = new Object(); } } return baz; } } 2.2.7 不能在finally中返回值。 n 規(guī)范描述: finally中是必須執(zhí)行的程序塊,如果在里面返回,則表示該方法返回值只能為這個,其他地
47、方返回值可能無效。 n PMD規(guī)則名稱: ReturnFromFinallyBlock n 規(guī)則級別: Error High n 違規(guī)示例代碼: public int foo(String value) { try { return Integer.parseInt(value); } catch (Exception e) { return 0;; } finally { return -1; // Very bad. } } n 合法代碼示例: public int foo(String value) { in
48、t ret=0; try { ret= Integer.parseInt(value); } catch (Exception e) { ret= 0; } finally { //處理其他事宜 …… } return ret; // Very good. } 2.2.8 Boolean實例化時,應(yīng)用使用Boolean.valueOf,Boolean.TRUE,Boolean.FALSE。 n 規(guī)范描述: 采用Boolean.valueOf,Boolean.TRUE,Boolean.FALSE進(jìn)行實例
49、化具有更高的效率。 n PMD規(guī)則名稱: BooleanInstantiation n 規(guī)則級別: Error High n 違規(guī)示例代碼: Boolean bar = new Boolean("true");//效率較低 n 合法代碼示例: // just do a Boolean bar = Boolean.TRUE; Boolean buz = Boolean.valueOf(false); // just do a Boolean buz = Boolean.FALSE; 2.2.9 Integer,Byte,Short,Long等實例化時,應(yīng)用使用va
50、lueOf n 規(guī)范描述: Integer,Byte,Short,Long實例化時使用valueOf具有更高的效率。 n PMD規(guī)則名稱: IntegerInstantiation ByteInstantiation ShortInstantiation LongInstantiation n 規(guī)則級別: Error High n 違規(guī)示例代碼: Integer v=new Integer(1); Byte v=new Byte(1); Short v=new Short(1); Long v=new Long(1); n 合法代碼示例: Integer
51、v= Integer.valueOf(1); Byte v=new Byte.valueOf(1); Short v= Short.valueOf(1); Long v= Long.valueOf(1); 2.2.10 對于多個if語句嵌套的情況下能夠整合盡量整合。 n 規(guī)范描述: 對于多個if語句嵌套的情況下能夠整合必須根據(jù)情況整合。 n PMD規(guī)則名稱: CollapsibleIfStatements n 規(guī)則級別: Error n 違規(guī)示例代碼: void bar() { if (x) { if (y) { // do stuff
52、 } } } n 合法代碼示例: void bar() { if (x&y) { // do stuff } } 2.2.11 override function,不能只有super.function語句,否則視為無效代碼 n 規(guī)范描述: Over ride function則表示為該方法定義新的行為,如果僅僅super.function(),則沒有任何意義,該處代碼視為廢棄代碼。。 n PMD規(guī)則名稱: UselessOverridingMethod n 規(guī)則級別: Error High n 違規(guī)示例代碼: pu
53、blic class Foo { public void foo(String bar) { super.foo(bar); //Why bother overriding? } n 合法代碼示例: 2.2.12 Collection.toArray的注意事項。 n 規(guī)范描述: 對于Collection接口來說,使用toArray轉(zhuǎn)數(shù)據(jù)時,如果沒有指明類型,將返回Object[],而不能使用類似(Integer[])list.toArray()進(jìn)行強(qiáng)轉(zhuǎn)成其他類型的數(shù)組,需要類似toArray(new Integer[list.size()])方式進(jìn)行轉(zhuǎn)
54、換。 n PMD規(guī)則名稱: ClassCastExceptionWithToArray n 規(guī)則級別: Error High n 違規(guī)示例代碼: Collection c=new ArrayList(); Integer obj=new Integer(1); c.add(obj); // this would trigger the rule (and throw a ClassCastException if executed) Integer[] a=(Integer [])c.toArray(); n 合法代碼示例: Collection c=ne
55、w ArrayList(); Integer obj=new Integer(1); c.add(obj); // this wouldnt trigger the rule Integer[] b=(Integer [])c.toArray(new Integer[c.size()]); 2.2.13 對于BigDecimal方法,應(yīng)避免使用float值,double值進(jìn)行創(chuàng)建,應(yīng)使用字符串形式創(chuàng)建。 n 規(guī)范描述: 對于BigDecimal,直接使用float,double創(chuàng)建時,因為精度不同會發(fā)生變化,例如0.1,會變成.10000000000000000555111512
56、31257827021181583404541015625,這樣會導(dǎo)致業(yè)務(wù)計算造成偏差。 n PMD規(guī)則名稱: AvoidDecimalLiteralsInBigDecimalConstructor n 規(guī)則級別: Error High n 違規(guī)示例代碼: // this would trigger the rule BigDecimal bd=new BigDecimal(1.123); n 合法代碼示例: // this wouldnt trigger the rule BigDecimal bd=new BigDecimal("1.123");
57、 2.2.14 String,BigDecimal,BigInteger等值類型調(diào)用replace,add等方法的注意事項。 n 規(guī)范描述: String,BigDecimal,BigInteger為值類型,當(dāng)調(diào)用replace,replaceAll對字符串中替代函數(shù),BigDecimal,BigIneger等add運(yùn)算函數(shù),會生成一個結(jié)果值對象返回,而不是修改本身調(diào)用者對象,該規(guī)則正是在這方面進(jìn)行檢查。 n PMD規(guī)則名稱: UselessOperationOnImmutable n 規(guī)則級別: Error High n 違規(guī)示例代碼: BigDecimal bd=n
58、ew BigDecimal(10); bd.add(new BigDecimal(5)); // bd仍然為10 n 合法代碼示例: BigDecimal bd=new BigDecimal(10); bd = bd.add(new BigDecimal(5)); // bd為15 2.2.15 需要注意的引起NullException的語句。 n 規(guī)范描述: 對空指針對象進(jìn)行操作時,會拋出NullException異常,該規(guī)則則是在代碼編寫以及代碼健全性上避免這些導(dǎo)致空指針異常的場景,規(guī)則如下: 使用equals時,常量應(yīng)該放在前面,例如常量.equals(對象); 判
59、非空:string!=null&&string.length()>0; 判空: string==null||string.length()<=0; 執(zhí)行類似equals語句:a!=null&&a.equals(b); 禁止使用equals(null)方式 n PMD規(guī)則名稱: MisplacedNullCheck UnusedNullCheckInEquals BrokenNullCheck n 規(guī)則級別: Error High n 違規(guī)示例代碼: 1、 空指針檢查錯位 if (a.equals(baz) && a != null){ …… }; if
60、(a.equals(baz) || a == null){ …… }; 2、 無用的空指針檢查 if (a!=null && b.equals(a)) { // 該處雖然對a對象進(jìn)行了檢查,但沒有對b進(jìn)行檢查 //whatever } 3、 常見的判空,判非空代碼編寫上的錯誤 //判非空,卻使用了|| if (string!=null || !string.equals("")){ return string; } //判空卻用了&& if (string==null && string.equals("")){ return string; } 4
61、、 比較對象是否為空,使用了equals str.equals(null) n 合法代碼示例: 1、 空指針檢查應(yīng)放在前面 if (a != null && a.equals(baz)){ …… }; if (a == null ||a.equals(baz)){ …… }; 2、 已檢查的對象作為調(diào)用者 if (a!=null && a.equals(method1)) { // 該處雖然對a對象進(jìn)行了檢查,但沒有對mothod1進(jìn)行檢查 //whatever } 3、 常見的判空,判非空代碼編寫上的錯誤 //判非空用了&& if (string!=
62、null && !string.equals("")){ return string; } //判空用|| if (string==null || string.equals("")){ return string; } 4、 比較對象是否為空,使用了== If(str==null) 2.2.16 ResultSet使用next時,需要判斷是否具有記錄再進(jìn)行一下步操作。 n 規(guī)范描述: java對數(shù)據(jù)庫進(jìn)行查詢操作,取得結(jié)果集合ResultSet對象,使用next,讓游標(biāo)定位到下一行,下一行不存在時,next()返回false,該規(guī)則這是強(qiáng)制對下一行是否用記錄進(jìn)行判
63、斷,根據(jù)結(jié)果進(jìn)行后續(xù)操作。 n PMD規(guī)則名稱: CheckResultSet n 規(guī)則級別: Error High n 違規(guī)示例代碼: Statement stat = conn.createStatement(); ResultSet rst = stat.executeQuery("SELECT name FROM person"); rst.next(); // what if it returns a false ? String firstName = rst.getString(1); n 合法代碼示例: // This is appropriate...
64、 Statement stat = conn.createStatement(); ResultSet rst = stat.executeQuery("SELECT name FROM person"); if (rst.next()) { String firstName = rst.getString(1); } else { // here you deal with the error ( at least log it) } 2.2.17 字符串使用相應(yīng)的規(guī)則。 n 規(guī)范描述: 字符串是應(yīng)用服務(wù)器創(chuàng)建最多的對象之一,對字符串操作按照合適的
65、規(guī)則進(jìn)行編寫,會極大增加應(yīng)用服務(wù)整體性能,以下是字符串操作相應(yīng)的規(guī)則: 字符串比較需要使用equals,而不是==,!=,因為==只是對同一引用的對象比較認(rèn)為相同,而不比較對象里內(nèi)容是否相等; 使用StringBuffer代替string+string+string進(jìn)行字符串相加,n個字符相加,如果直接用“+“號,會新產(chǎn)生n-1個StringBuffer對象,以及n-1個String對象,而用StringBuffer只會產(chǎn)生1個String,1個StringBuffer對象。 使用equalsIgnoreCase() 替代 toUpperCase/toLowerCase().equals
66、(),這樣減少一個對象的創(chuàng)建,效率更高。 使用StringBuffer.length()替代StringBuffer.toString().length(),這樣減少一個對象的創(chuàng)建,效率更高。 對于String對象禁止使用string.toString(),本身是String對象,這樣調(diào)用效率低下,而且由于string沒有判空,很可能導(dǎo)致空異常的風(fēng)險。 n PMD規(guī)則名稱: UseEqualsToCompareStrings UseStringBufferLength UnnecessaryCaseChange UseStringBufferLen StringToString n 規(guī)則級別: Error High n 違規(guī)示例代碼: 1、 字符串比較 if(str1==str2){ …… } 2、 字符串相加 String str=str1+str2+str3+str4; 3、 大小寫不敏感字符串比較 str1.toUpperCase().equals(str2.toUpperCase()); 4、 取StringBuffer
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧汽貿(mào)的戰(zhàn)略規(guī)劃課件
- 農(nóng)藥產(chǎn)品化學(xué)登記評審中存在的問題修改
- 職業(yè)適應(yīng)與發(fā)展
- 中國傳統(tǒng)思想和領(lǐng)導(dǎo)藝術(shù)
- 學(xué)習(xí)英語最好的方法課件
- 團(tuán)隊建設(shè)與管理教材(PPT 42頁)
- 商務(wù)談判的準(zhǔn)備培訓(xùn)課件
- 單元吃奶和豆及其制品
- 氣管切開護(hù)理
- 七上281有理數(shù)的乘法1
- 素質(zhì)拓展學(xué)分重要性
- 地產(chǎn)項目策劃廣告創(chuàng)意
- 華通檸檬渠道推廣活動案
- 酸堿平衡紊亂的判讀
- 氣管插管的困難評估課件