[計(jì)算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范
《[計(jì)算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范》由會(huì)員分享,可在線閱讀,更多相關(guān)《[計(jì)算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范(47頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 Java開發(fā)規(guī)范 Aostar & YinHai 開發(fā)管理 文件編號(hào): 文件名稱: Java開發(fā)規(guī)范 版 本 號(hào) 日期: 項(xiàng)目名稱 項(xiàng)目編號(hào): 項(xiàng)目負(fù)責(zé)人 立項(xiàng)日期: 修訂歷史記錄 日期 版本號(hào) 作者 說(shuō)明 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)無(wú)包的類 10 2.1.6 類和方法必須擁有注釋,注釋量占總體代碼25%以上,類頭部,以及方法頭部的注釋應(yīng)符合javadoc標(biāo)準(zhǔn)。 10 2.2 基本語(yǔ)法 11 2.2.1 不能隨意捕捉異常,原則上誰(shuí)捕捉誰(shuí)處理 11 2.2.2 if,while
3、,try,finally,switch , synchronized , static instantiation 里面應(yīng)有相應(yīng)的邏輯處理,不能為空。 12 2.2.3 在處理循環(huán)中,不能在程序中人為的改變步長(zhǎng)。 13 2.2.4 將簡(jiǎn)單類型int,short,float,double等轉(zhuǎn)化成字符串時(shí),需使用其對(duì)應(yīng)類的toString方法。 13 2.2.5 javaBean中hashCode,以及equals方法必須同時(shí)override。 14 2.2.6 懶式方式創(chuàng)建對(duì)象:不能采用雙檢查慣用法 17 2.2.7 不能在finally中返回值。 18 2.2.8 Boolean實(shí)
4、例化時(shí),應(yīng)用使用Boolean.valueOf,Boolean.TRUE,Boolean.FALSE。 19 2.2.9 Integer,Byte,Short,Long等實(shí)例化時(shí),應(yīng)用使用valueOf 19 2.2.10 對(duì)于多個(gè)if語(yǔ)句嵌套的情況下能夠整合盡量整合。 20 2.2.11 override function,不能只有super.function語(yǔ)句,否則視為無(wú)效代碼 20 2.2.12 Collection.toArray的注意事項(xiàng)。 21 2.2.13 對(duì)于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等方法的注意事項(xiàng)。 22 2.2.15 需要注意的引起NullException的語(yǔ)句。 22 2.2.16 ResultSet使用next時(shí),需要判斷是否具有記錄再進(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)資源釋放(誰(shuí)創(chuàng)建的,誰(shuí)關(guān)閉) 28 2.2.22 使用Clone時(shí)相應(yīng)的規(guī)則。 32 2.2.23 java Bean類必須實(shí)現(xiàn)Serialize接口。 32 2.2.24 比較對(duì)象相等應(yīng)使用equals,而不是==。 32 2.2.25 Array數(shù)組拷貝應(yīng)使用System.arrayCopy。 33 2.3 耦合性以及設(shè)計(jì) 33 2.3.1 switch語(yǔ)句必須包含default標(biāo)簽。 33 2.3.2 精簡(jiǎn)boolean表達(dá)式以及boolean返回值。 34 2.3.3 在方法實(shí)現(xiàn)中應(yīng)避免對(duì)
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ī)范的目的在于:建立一個(gè)可行可操作的編程標(biāo)準(zhǔn)、約定和指南,以規(guī)范公司java代碼研發(fā)工作。 2009年為公司的質(zhì)量年,為了提高公司研發(fā)能力,該規(guī)范的制定是為了規(guī)范java代碼開發(fā),提高java開發(fā)質(zhì)量,從代碼的層面規(guī)范并提高java項(xiàng)目的研發(fā)水平。該規(guī)范由運(yùn)營(yíng)中心技術(shù)小組制定,運(yùn)營(yíng)中心技術(shù)小組將結(jié)合PMD檢查工具以及相應(yīng)的檢查工具,組織技術(shù)監(jiān)控人員
9、對(duì)重點(diǎn)項(xiàng)目以及新的java項(xiàng)目定期檢查,對(duì)代碼質(zhì)量進(jìn)行評(píng)估,對(duì)代碼質(zhì)量較差限期整改,并報(bào)運(yùn)營(yíng)中心備案作為項(xiàng)目考核依據(jù)。 本規(guī)范適用于2009年公司java代碼研發(fā)規(guī)范。本規(guī)范的內(nèi)容包括兩個(gè)方面:java開發(fā)一般規(guī)范,以及java代碼開發(fā)安全性規(guī)范。Java代碼開發(fā)一般規(guī)范主要從java基本語(yǔ)法,代碼格式,耦合性以及設(shè)計(jì)方面,以及代碼質(zhì)量因子等進(jìn)行描述;java代碼開發(fā)安全性規(guī)范主要從sql注入,資源注入,跨站腳步,安全邊界違例,系統(tǒng)信息泄露進(jìn)行描述。 為了方便并配合PMD檢查工具等相應(yīng)檢查工具,方便開發(fā)者針對(duì)違規(guī)代碼進(jìn)行調(diào)整,本規(guī)范中java一般開發(fā)規(guī)范描述形式將結(jié)合PMD,并提供示例代碼
10、,其形式如下: n 規(guī)范描述: n PMD規(guī)則名稱: n PMD級(jí)別(注1): n 違規(guī)示例代碼: n 合法示例代碼: 本規(guī)范中java安全開發(fā)規(guī)范部分將結(jié)合具體項(xiàng)目,對(duì)出現(xiàn)安全隱患的代碼進(jìn)行分析,以及相應(yīng)的解決辦法和思路上進(jìn)行分析,其具體格式如下: n 風(fēng)險(xiǎn)及危害: n 應(yīng)對(duì)措施: n 非安全代碼示例 n 安全代碼示例 本規(guī)范解釋權(quán)歸運(yùn)營(yíng)中心技術(shù)小組,屬于運(yùn)營(yíng)中心為了提供公司研發(fā)水平以及質(zhì)量的一系列措施中的一部分,在后續(xù)的版本中將根據(jù)具體需要進(jìn)行修改以及調(diào)整。 注1:PMD級(jí)別分為5級(jí) Error high 必須修改
11、 Error 不修改的項(xiàng)需要進(jìn)行說(shuō)明 Warning high 代碼中該項(xiàng)每千行代碼不能多于2%; Warning 參考 Information 參考 注2:對(duì)于Error級(jí)別需要項(xiàng)目組通過(guò)以下文字說(shuō)明: 文件名 代碼行數(shù) 觸發(fā)PMD規(guī)則 不修改原因 技術(shù)小組審核意見 技術(shù)小組審核后給出相應(yīng)的整改意見,對(duì)于有爭(zhēng)議的問題,可直接與運(yùn)營(yíng)中心技術(shù)小組領(lǐng)導(dǎo)成員溝通。 第2章 java一般性研發(fā)規(guī)范 2.1 代碼格式 2.1.1 包、類、方法的命名規(guī)范
12、: n 規(guī)范描述: 包,類,方法命名只能為27個(gè)英文字符以及數(shù)字,不能包括特殊字符例如-,_,$等; 包命名,首字符必須小寫; 類命名,首字符必須大寫; 方法命名,首字符必須小寫; 常量命名,必須全部大寫; 變量,以及屬性命名,首字符必須小寫; 在類中非創(chuàng)建方法其命名應(yīng)避免與類命一致; 在類中屬性的命名應(yīng)避免與類命一致; 在同一類中屬新命名應(yīng)避免與方法命名一致; 在方法中命名臨時(shí)變量時(shí)應(yīng)避免與方法的參數(shù)名一致; n PMD規(guī)則名稱: AvoidDollarSigns PackageCase ClassNamingConventions MethodNamingC
13、onventions SuspiciousConstantFieldName VariableNamingConventions MethodWithSameNameAsEnclosingClass AvoidFieldNameMatchingTypeName MisleadingVariableName n 規(guī)則級(jí)別: 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、 方法中臨時(shí)變量的命名應(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)是比較兩個(gè)對(duì)象是否相;int hashCode()取得hash值,主要用于hash表;Object
18、 clone()用于復(fù)制對(duì)象;void finalizer()用于該類實(shí)例化的對(duì)象釋放時(shí)系統(tǒng)調(diào)用釋放該對(duì)象使用的資源。這些方法具有固定的形參格式,固定的返回值,不能被其他形式或者用于其他方面的方法override,否則將降低代碼可讀性,并為代碼維護(hù)帶來(lái)隱患。 n PMD規(guī)則名稱: SuspiciousEqualsMethodName SuspiciousHashcodeMethodName; FinalizeOverloaded; BooleanGetMethodName; n 規(guī)則級(jí)別: 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 } } 注:一般來(lái)說(shuō)override hashCode方法為了避免鍵值沖突,提高h(yuǎn)ash表的查詢效率,可采用37乘法原則,例如某javabean中包含兩個(gè)關(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、 對(duì)于java bean來(lái)說(shuō),get***是取得該bean的屬性值,set***為設(shè)置該bean的屬性值,is***是獲得該bean中為boolean類型的屬性值,這些方法對(duì)java bean來(lái)說(shuō)是具有特殊意義,如果命名不規(guī)范將導(dǎo)致在使用java bean內(nèi)置方法時(shí)出現(xiàn)取值,或者設(shè)值不成功。 n PMD規(guī)則名稱: BooleanGetMethodName n 規(guī)則級(jí)別: 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ǔ)句,必須使用{}將業(yè)務(wù)處理邏輯包含在內(nèi),這樣可大大提高代碼可讀性,有利于后續(xù)代碼維護(hù)。 n PMD規(guī)則名稱: IfStmtsMustUseBraces WhileLoopsMustUseBraces IfElseStmtsMustUseBraces ForLoopsMustUseBraces n 規(guī)則級(jí)別: warn High n 違規(guī)示例代碼: 1、 if語(yǔ)句違例代碼 if (foo) x++; 2、 else語(yǔ)句違例代碼
24、if (foo) x++ else x--; 3、while語(yǔ)句違例代碼 while(x<100) x++; 4、 for語(yǔ)句違例代碼 for(int i=0;i<10;i++) x++; n 合法代碼示例: 1、 if語(yǔ)句 if (foo){ x++; } 2、 else語(yǔ)句 if (foo){ x++ }else{ x--; } 3、while語(yǔ)句 while(x<100){ x++; } 5、 for語(yǔ)句 for(int i=0;i<10;i++){ x++; } 2.
25、1.5 類必須包含在包里,禁止出現(xiàn)無(wú)包的類 n 規(guī)范描述: 包是java中類所在命名空間,用于類載入時(shí),虛擬機(jī)快速定位并查找該類;如果一個(gè)無(wú)包類,在類載入時(shí),耗時(shí)較多,并且很可能無(wú)法找到該類。 n PMD規(guī)則名稱: NoPackage n 規(guī)則級(jí)別: error High 2.1.6 類和方法必須擁有注釋,注釋量占總體代碼25%以上,類頭部,以及方法頭部的注釋應(yīng)符合javadoc標(biāo)準(zhǔn)。 n 規(guī)范描述: 注釋多少是評(píng)價(jià)代碼質(zhì)量好壞的一個(gè)標(biāo)準(zhǔn),25%是符合國(guó)際上對(duì)java注釋的標(biāo)準(zhǔn);對(duì)于類頭部注釋,方法頭部注釋符合javadoc標(biāo)準(zhǔn),可java工具自動(dòng)根據(jù)源碼生成相應(yīng)的ja
26、va幫助文檔。對(duì)于類頭部注釋需要包含以下信息:該類的主用功能,作者,以及創(chuàng)建時(shí)間等信息;對(duì)于方法頭部注釋需要包含以下信息:該方法的主要功能,以及參數(shù)類型含義,返回值類型含義等等。 n 合法代碼注釋示例 1、 類頭部注釋規(guī)范 /** * 實(shí)時(shí)數(shù)據(jù)文件解析:讀取實(shí)時(shí)數(shù)據(jù)文件,對(duì)其內(nèi)容進(jìn)行解析,生成符合格式以及標(biāo)準(zhǔn)單位的數(shù)據(jù)集合 * @author wangliuyi * @version 1.0 * @since 2009-05-15 */ public class DataFileParse{ 2、 方法頭部注釋規(guī)范 /** * 判斷該時(shí)間是否在統(tǒng)計(jì)時(shí)區(qū)里面
27、* @param time long 從實(shí)時(shí)采集文件中提取的時(shí)間,該時(shí)間為格林威治時(shí)間,單位為毫秒 * @return boolean true:表示該時(shí)間在合法的時(shí)間區(qū)內(nèi) false:表示該時(shí)間不合法 */ public boolean checkStatTimeZone(long time) 3、 屬性以及方法內(nèi)部的注釋通過(guò)“//”注釋 public class GeneralStat implements IStat { //解析數(shù)據(jù)格式的分隔符號(hào) private String separator = ","; //開始統(tǒng)計(jì)序號(hào) private int
28、startNum = 1; 2.2 基本語(yǔ)法 2.2.1 不能隨意捕捉異常,原則上誰(shuí)捕捉誰(shuí)處理 n 規(guī)范描述: Java程序運(yùn)行過(guò)程中產(chǎn)生異常,意味著有錯(cuò)誤產(chǎn)生,捕捉該異常,就需要對(duì)該異常進(jìn)行處理:例如記錄日志,事務(wù)回滾等,如果僅捕獲而不處理,人為的屏蔽異常,調(diào)用該函數(shù),可能為調(diào)用者帶來(lái)困惑,調(diào)用者極可能認(rèn)為該方法正常運(yùn)行而做出錯(cuò)誤的判斷。 一般來(lái)說(shuō),異常處理機(jī)制屬于應(yīng)用程序總體框架的一部分,一個(gè)良好的異常處理機(jī)制可以避免系統(tǒng)產(chǎn)生的一些不可預(yù)測(cè)的結(jié)果,并提高代碼可讀性,可維護(hù)性,從而提高代碼的質(zhì)量。本規(guī)則要對(duì)異常處理進(jìn)行檢查,對(duì)一些捕捉后不處理,或者直接將該異常拋出等進(jìn)行預(yù)警。 n
29、 PMD規(guī)則名稱: EmptyCatchBlock n 規(guī)則級(jí)別: 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中處理邏輯部分如果為空,很可能這段代碼無(wú)任何作用,是段廢棄的代碼,這段代碼的存在不僅對(duì)代碼維護(hù)帶來(lái)疑惑,降低了整體的代碼質(zhì)量。 n PMD規(guī)則名稱: EmptyIfStmt EmptyWhileStmt EmptyTryBlock EmptyFinallyBlock EmptySwitchStatements EmptySynchronizedBlock EmptyStaticInitializer n 規(guī)則
32、級(jí)別: Warn High n 違規(guī)示例代碼: 1. if語(yǔ)句中為空 if (foo){ } 2. while語(yǔ)句中為空 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)中,不能在程序中人為的改變步長(zhǎng)。 n 規(guī)范描述: 在循環(huán)中對(duì)步長(zhǎng)變量人為的改變,很
33、有可能喪失對(duì)步長(zhǎng)的控制,導(dǎo)致運(yùn)行時(shí)出現(xiàn)一些不可預(yù)測(cè)的結(jié)果。該規(guī)則是限制開發(fā)者對(duì)這種場(chǎng)景的使用,畢竟步長(zhǎng)在多個(gè)地方改變,開發(fā)者很容易沒有考慮全面,導(dǎo)致在特殊情況下出錯(cuò)。 n PMD規(guī)則名稱: JumbledIncrementer n 規(guī)則級(jí)別: Error n 違規(guī)示例代碼: 1. 上述代碼會(huì)陷入死循環(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 將簡(jiǎn)單類型int,short,float,double等轉(zhuǎn)化成字符串時(shí),需使用其對(duì)應(yīng)類的toString方法。 n 規(guī)范描述: 將java中簡(jiǎn)單類型轉(zhuǎn)換成字符串時(shí),如果采用先轉(zhuǎn)換成對(duì)應(yīng)的類型的對(duì)象,然后通過(guò)值對(duì)象轉(zhuǎn)換成字符串,該過(guò)程將產(chǎn)生兩個(gè)對(duì)象的創(chuàng)建,而直接采用對(duì)應(yīng)類型的toString方法,只產(chǎn)生一個(gè)對(duì)象的創(chuàng)建,其效率是前者的兩倍。 n PMD規(guī)則名稱: UnnecessaryConversionTemporary n 規(guī)則級(jí)別: 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方法必須同時(shí)override。 n 規(guī)范描述: HashCode是生成hash值,可用于hash表中主鍵的查找,equals是比較兩個(gè)對(duì)象是否相
37、等,缺省的hashCode以及equals只能針對(duì)同一引用的對(duì)象,如果為不同的引用的對(duì)象,雖然其值是相等,但使用hashCode卻是不同的值,而使用equals返回的也是false。在某些場(chǎng)合中,例如將某javabean對(duì)象作為hash表的主鍵值,或者判斷某對(duì)象是否在集合中,如果不實(shí)現(xiàn)hashCode,以及equals會(huì)得到不可預(yù)測(cè)的結(jié)果。 n PMD規(guī)則名稱: OverrideBothEqualsAndHashCode n 規(guī)則級(jí)別: 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(); } /**自動(dòng)生成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á)時(shí)間,下達(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(); } /**自動(dòng)生成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)建對(duì)象:不能采用雙檢查慣用法 n 規(guī)范描述: 雙檢查一般用于c,c++懶式方式獲得資源時(shí)慣用模式,但在java中該模式是不適用的,因?yàn)閖ava創(chuàng)建對(duì)象時(shí),先將對(duì)象創(chuàng)建后,直接將指針賦予給變量,然后才進(jìn)行后續(xù)的初始化,在初始化這段空白期中,如果另外的線程獲得該對(duì)象的引用,調(diào)用該對(duì)象,會(huì)產(chǎn)
45、生一些不可預(yù)測(cè)的結(jié)果。 n PMD規(guī)則名稱: DoubleCheckLock n 規(guī)則級(jí)別: 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í)行的程序塊,如果在里面返回,則表示該方法返回值只能為這個(gè),其他地
47、方返回值可能無(wú)效。 n PMD規(guī)則名稱: ReturnFromFinallyBlock n 規(guī)則級(jí)別: 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實(shí)例化時(shí),應(yīng)用使用Boolean.valueOf,Boolean.TRUE,Boolean.FALSE。 n 規(guī)范描述: 采用Boolean.valueOf,Boolean.TRUE,Boolean.FALSE進(jìn)行實(shí)例
49、化具有更高的效率。 n PMD規(guī)則名稱: BooleanInstantiation n 規(guī)則級(jí)別: 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等實(shí)例化時(shí),應(yīng)用使用va
50、lueOf n 規(guī)范描述: Integer,Byte,Short,Long實(shí)例化時(shí)使用valueOf具有更高的效率。 n PMD規(guī)則名稱: IntegerInstantiation ByteInstantiation ShortInstantiation LongInstantiation n 規(guī)則級(jí)別: 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 對(duì)于多個(gè)if語(yǔ)句嵌套的情況下能夠整合盡量整合。 n 規(guī)范描述: 對(duì)于多個(gè)if語(yǔ)句嵌套的情況下能夠整合必須根據(jù)情況整合。 n PMD規(guī)則名稱: CollapsibleIfStatements n 規(guī)則級(jí)別: 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語(yǔ)句,否則視為無(wú)效代碼 n 規(guī)范描述: Over ride function則表示為該方法定義新的行為,如果僅僅super.function(),則沒有任何意義,該處代碼視為廢棄代碼。。 n PMD規(guī)則名稱: UselessOverridingMethod n 規(guī)則級(jí)別: 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的注意事項(xiàng)。 n 規(guī)范描述: 對(duì)于Collection接口來(lái)說(shuō),使用toArray轉(zhuǎn)數(shù)據(jù)時(shí),如果沒有指明類型,將返回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ī)則級(jí)別: 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 對(duì)于BigDecimal方法,應(yīng)避免使用float值,double值進(jìn)行創(chuàng)建,應(yīng)使用字符串形式創(chuàng)建。 n 規(guī)范描述: 對(duì)于BigDecimal,直接使用float,double創(chuàng)建時(shí),因?yàn)榫炔煌瑫?huì)發(fā)生變化,例如0.1,會(huì)變成.10000000000000000555111512
56、31257827021181583404541015625,這樣會(huì)導(dǎo)致業(yè)務(wù)計(jì)算造成偏差。 n PMD規(guī)則名稱: AvoidDecimalLiteralsInBigDecimalConstructor n 規(guī)則級(jí)別: 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等方法的注意事項(xiàng)。 n 規(guī)范描述: String,BigDecimal,BigInteger為值類型,當(dāng)調(diào)用replace,replaceAll對(duì)字符串中替代函數(shù),BigDecimal,BigIneger等add運(yùn)算函數(shù),會(huì)生成一個(gè)結(jié)果值對(duì)象返回,而不是修改本身調(diào)用者對(duì)象,該規(guī)則正是在這方面進(jìn)行檢查。 n PMD規(guī)則名稱: UselessOperationOnImmutable n 規(guī)則級(jí)別: 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的語(yǔ)句。 n 規(guī)范描述: 對(duì)空指針對(duì)象進(jìn)行操作時(shí),會(huì)拋出NullException異常,該規(guī)則則是在代碼編寫以及代碼健全性上避免這些導(dǎo)致空指針異常的場(chǎng)景,規(guī)則如下: 使用equals時(shí),常量應(yīng)該放在前面,例如常量.equals(對(duì)象); 判
59、非空:string!=null&&string.length()>0; 判空: string==null||string.length()<=0; 執(zhí)行類似equals語(yǔ)句:a!=null&&a.equals(b); 禁止使用equals(null)方式 n PMD規(guī)則名稱: MisplacedNullCheck UnusedNullCheckInEquals BrokenNullCheck n 規(guī)則級(jí)別: Error High n 違規(guī)示例代碼: 1、 空指針檢查錯(cuò)位 if (a.equals(baz) && a != null){ …… }; if
60、(a.equals(baz) || a == null){ …… }; 2、 無(wú)用的空指針檢查 if (a!=null && b.equals(a)) { // 該處雖然對(duì)a對(duì)象進(jìn)行了檢查,但沒有對(duì)b進(jìn)行檢查 //whatever } 3、 常見的判空,判非空代碼編寫上的錯(cuò)誤 //判非空,卻使用了|| if (string!=null || !string.equals("")){ return string; } //判空卻用了&& if (string==null && string.equals("")){ return string; } 4
61、、 比較對(duì)象是否為空,使用了equals str.equals(null) n 合法代碼示例: 1、 空指針檢查應(yīng)放在前面 if (a != null && a.equals(baz)){ …… }; if (a == null ||a.equals(baz)){ …… }; 2、 已檢查的對(duì)象作為調(diào)用者 if (a!=null && a.equals(method1)) { // 該處雖然對(duì)a對(duì)象進(jìn)行了檢查,但沒有對(duì)mothod1進(jìn)行檢查 //whatever } 3、 常見的判空,判非空代碼編寫上的錯(cuò)誤 //判非空用了&& if (string!=
62、null && !string.equals("")){ return string; } //判空用|| if (string==null || string.equals("")){ return string; } 4、 比較對(duì)象是否為空,使用了== If(str==null) 2.2.16 ResultSet使用next時(shí),需要判斷是否具有記錄再進(jìn)行一下步操作。 n 規(guī)范描述: java對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢操作,取得結(jié)果集合ResultSet對(duì)象,使用next,讓游標(biāo)定位到下一行,下一行不存在時(shí),next()返回false,該規(guī)則這是強(qiáng)制對(duì)下一行是否用記錄進(jìn)行判
63、斷,根據(jù)結(jié)果進(jìn)行后續(xù)操作。 n PMD規(guī)則名稱: CheckResultSet n 規(guī)則級(jí)別: 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)建最多的對(duì)象之一,對(duì)字符串操作按照合適的
65、規(guī)則進(jìn)行編寫,會(huì)極大增加應(yīng)用服務(wù)整體性能,以下是字符串操作相應(yīng)的規(guī)則: 字符串比較需要使用equals,而不是==,!=,因?yàn)?=只是對(duì)同一引用的對(duì)象比較認(rèn)為相同,而不比較對(duì)象里內(nèi)容是否相等; 使用StringBuffer代替string+string+string進(jìn)行字符串相加,n個(gè)字符相加,如果直接用“+“號(hào),會(huì)新產(chǎn)生n-1個(gè)StringBuffer對(duì)象,以及n-1個(gè)String對(duì)象,而用StringBuffer只會(huì)產(chǎn)生1個(gè)String,1個(gè)StringBuffer對(duì)象。 使用equalsIgnoreCase() 替代 toUpperCase/toLowerCase().equals
66、(),這樣減少一個(gè)對(duì)象的創(chuàng)建,效率更高。 使用StringBuffer.length()替代StringBuffer.toString().length(),這樣減少一個(gè)對(duì)象的創(chuàng)建,效率更高。 對(duì)于String對(duì)象禁止使用string.toString(),本身是String對(duì)象,這樣調(diào)用效率低下,而且由于string沒有判空,很可能導(dǎo)致空異常的風(fēng)險(xiǎn)。 n PMD規(guī)則名稱: UseEqualsToCompareStrings UseStringBufferLength UnnecessaryCaseChange UseStringBufferLen StringToString n 規(guī)則級(jí)別: Error High n 違規(guī)示例代碼: 1、 字符串比較 if(str1==str2){ …… } 2、 字符串相加 String str=str1+str2+str3+str4; 3、 大小寫不敏感字符串比較 str1.toUpperCase().equals(str2.toUpperCase()); 4、 取StringBuffer
- 溫馨提示:
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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 外科營(yíng)養(yǎng)支持病人的護(hù)理 (2)
- 電子商務(wù)師基礎(chǔ)知識(shí)培訓(xùn)教案PPT課件
- 三重積分的概念與性質(zhì)分析
- 輸液外滲處理及預(yù)防課件
- 輔導(dǎo)員說(shuō)課之認(rèn)識(shí)你自己課件
- 火山與地震課件
- 4.網(wǎng)站的開發(fā)技術(shù)
- 部編版三年級(jí)上冊(cè)語(yǔ)文第六單元海濱小城(完美版)課件
- 部編版七年語(yǔ)文下冊(cè)《4孫權(quán)勸學(xué)》課件【2020精編】
- 古詩(shī)欣賞3--舟夜書所見課件
- 發(fā)生骨質(zhì)疏松癥的病因和高危人群課件
- 皂基原料及生產(chǎn)工藝課件
- 《芽的類型和發(fā)育》課件-(公開課獲獎(jiǎng))2022年濟(jì)南版
- 超越以往的實(shí)用圖表 (15)
- 第六章 審計(jì)風(fēng)險(xiǎn)