歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

[計(jì)算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范

  • 資源ID:27956886       資源大?。?span id="ypptii0" class="font-tahoma">329KB        全文頁數(shù):47頁
  • 資源格式: DOC        下載積分:15積分
快捷下載 游客一鍵下載
會(huì)員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺(tái)登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要15積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號(hào),方便查詢和重復(fù)下載(系統(tǒng)自動(dòng)生成)
支付方式: 支付寶    微信支付   
驗(yàn)證碼:   換一換

 
賬號(hào):
密碼:
驗(yàn)證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開,此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請(qǐng)知曉。

[計(jì)算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范

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)作者說明2009-6-25V1.0王流一目 錄第1章序言3第2章java一般性研發(fā)規(guī)范52.1代碼格式52.1.1包、類、方法的命名規(guī)范:52.1.2方法的命名應(yīng)注意避免與java中具有特殊意義的名稱例如equals,hashCode,clone,finalizer等沖突72.1.3Java bean中取得boolean類型的屬性值必須使用is*形式命名82.1.4if,else,while,for等必須使用92.1.5類必須包含在包里,禁止出現(xiàn)無包的類102.1.6類和方法必須擁有注釋,注釋量占總體代碼25%以上,類頭部,以及方法頭部的注釋應(yīng)符合javadoc標(biāo)準(zhǔn)。102.2基本語法112.2.1不能隨意捕捉異常,原則上誰捕捉誰處理112.2.2if,while,try,finally,switch , synchronized , static instantiation 里面應(yīng)有相應(yīng)的邏輯處理,不能為空。122.2.3在處理循環(huán)中,不能在程序中人為的改變步長。132.2.4將簡單類型int,short,float,double等轉(zhuǎn)化成字符串時(shí),需使用其對(duì)應(yīng)類的toString方法。132.2.5javaBean中hashCode,以及equals方法必須同時(shí)override。142.2.6懶式方式創(chuàng)建對(duì)象:不能采用雙檢查慣用法172.2.7不能在finally中返回值。182.2.8Boolean實(shí)例化時(shí),應(yīng)用使用Boolean.valueOf,Boolean.TRUE,Boolean.FALSE。192.2.9Integer,Byte,Short,Long等實(shí)例化時(shí),應(yīng)用使用valueOf192.2.10對(duì)于多個(gè)if語句嵌套的情況下能夠整合盡量整合。202.2.11override function,不能只有super.function語句,否則視為無效代碼202.2.12Collection.toArray的注意事項(xiàng)。212.2.13對(duì)于BigDecimal方法,應(yīng)避免使用float值,double值進(jìn)行創(chuàng)建,應(yīng)使用字符串形式創(chuàng)建。212.2.14String,BigDecimal,BigInteger等值類型調(diào)用replace,add等方法的注意事項(xiàng)。222.2.15需要注意的引起NullException的語句。222.2.16ResultSet使用next時(shí),需要判斷是否具有記錄再進(jìn)行一下步操作。242.2.17字符串使用相應(yīng)的規(guī)則。252.2.18禁止直接調(diào)用System.gc(),System.getRuntime().gc(),System.runFinalization()。262.2.19finalize相應(yīng)的規(guī)則。272.2.20禁止在代碼中使用System.out,ex.printStackTrace打印日志。272.2.21系統(tǒng)資源釋放(誰創(chuàng)建的,誰關(guān)閉)282.2.22使用Clone時(shí)相應(yīng)的規(guī)則。322.2.23java Bean類必須實(shí)現(xiàn)Serialize接口。322.2.24比較對(duì)象相等應(yīng)使用equals,而不是=。322.2.25Array數(shù)組拷貝應(yīng)使用System.arrayCopy。332.3耦合性以及設(shè)計(jì)332.3.1switch語句必須包含default標(biāo)簽。332.3.2精簡boolean表達(dá)式以及boolean返回值。342.3.3在方法實(shí)現(xiàn)中應(yīng)避免對(duì)輸入的值參進(jìn)行改變。352.3.4在創(chuàng)建方法中,應(yīng)避免調(diào)用被override的方法352.3.5public static常量屬性必須final。362.3.6Abstract 類必須含有abstract方法。372.3.7接口依賴性。372.4代碼質(zhì)量因素382.4.1Class代碼行數(shù)限制382.4.2函數(shù)代碼質(zhì)量38第3章java安全性檢查規(guī)范403.1跨站腳本XSS403.2違反信任邊界規(guī)則(Trust Boundary Violation)413.3不安全的反射(Unsafe Reflection)423.4SQL 注入(SQL Injection)433.5系統(tǒng)信息泄露(System Information Leakage)443.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)營中心技術(shù)小組制定,運(yùn)營中心技術(shù)小組將結(jié)合PMD檢查工具以及相應(yīng)的檢查工具,組織技術(shù)監(jiān)控人員對(duì)重點(diǎn)項(xiàng)目以及新的java項(xiàng)目定期檢查,對(duì)代碼質(zhì)量進(jìn)行評(píng)估,對(duì)代碼質(zhì)量較差限期整改,并報(bào)運(yùn)營中心備案作為項(xiàng)目考核依據(jù)。本規(guī)范適用于2009年公司java代碼研發(fā)規(guī)范。本規(guī)范的內(nèi)容包括兩個(gè)方面:java開發(fā)一般規(guī)范,以及java代碼開發(fā)安全性規(guī)范。Java代碼開發(fā)一般規(guī)范主要從java基本語法,代碼格式,耦合性以及設(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,并提供示例代碼,其形式如下: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)營中心技術(shù)小組,屬于運(yùn)營中心為了提供公司研發(fā)水平以及質(zhì)量的一系列措施中的一部分,在后續(xù)的版本中將根據(jù)具體需要進(jìn)行修改以及調(diào)整。 注1:PMD級(jí)別分為5級(jí) Error high 必須修改 Error 不修改的項(xiàng)需要進(jìn)行說明 Warning high 代碼中該項(xiàng)每千行代碼不能多于2%; Warning 參考 Information 參考注2:對(duì)于Error級(jí)別需要項(xiàng)目組通過以下文字說明:文件名代碼行數(shù)觸發(fā)PMD規(guī)則不修改原因技術(shù)小組審核意見技術(shù)小組審核后給出相應(yīng)的整改意見,對(duì)于有爭議的問題,可直接與運(yùn)營中心技術(shù)小組領(lǐng)導(dǎo)成員溝通。第2章 java一般性研發(fā)規(guī)范2.1 代碼格式2.1.1 包、類、方法的命名規(guī)范:n 規(guī)范描述:包,類,方法命名只能為27個(gè)英文字符以及數(shù)字,不能包括特殊字符例如-,_,$等;包命名,首字符必須小寫;類命名,首字符必須大寫;方法命名,首字符必須小寫;常量命名,必須全部大寫;變量,以及屬性命名,首字符必須小寫;在類中非創(chuàng)建方法其命名應(yīng)避免與類命一致;在類中屬性的命名應(yīng)避免與類命一致;在同一類中屬新命名應(yīng)避免與方法命名一致;在方法中命名臨時(shí)變量時(shí)應(yīng)避免與方法的參數(shù)名一致;n PMD規(guī)則名稱:AvoidDollarSignsPackageCaseClassNamingConventionsMethodNamingConventionsSuspiciousConstantFieldNameVariableNamingConventionsMethodWithSameNameAsEnclosingClassAvoidFieldNameMatchingTypeNameMisleadingVariableNamen 規(guī)則級(jí)別:Error Highwarn Highwarn Highwarn Highwarn HighError HighError HighError Highn 違規(guī)示例代碼:1、 常量、變量命名public static final 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)避免與類名一致public 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; / Bad7、 在類中屬性的命名應(yīng)避免與類命一致: public class Foo extends 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 = 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 clone()用于復(fù)制對(duì)象;void finalizer()用于該類實(shí)例化的對(duì)象釋放時(shí)系統(tǒng)調(diào)用釋放該對(duì)象使用的資源。這些方法具有固定的形參格式,固定的返回值,不能被其他形式或者用于其他方面的方法override,否則將降低代碼可讀性,并為代碼維護(hù)帶來隱患。n PMD規(guī)則名稱: SuspiciousEqualsMethodNameSuspiciousHashcodeMethodName;FinalizeOverloaded;BooleanGetMethodName;n 規(guī)則級(jí)別:Error HighError HighError HighError Highn 違規(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 public 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 hashCode() / oops, this probably was supposed to be hashCode 注:一般來說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ī)范描述:對(duì)于java bean來說,get*是取得該bean的屬性值,set*為設(shè)置該bean的屬性值,is*是獲得該bean中為boolean類型的屬性值,這些方法對(duì)java bean來說是具有特殊意義,如果命名不規(guī)范將導(dǎo)致在使用java bean內(nèi)置方法時(shí)出現(xiàn)取值,或者設(shè)值不成功。n PMD規(guī)則名稱: BooleanGetMethodNamen 規(guī)則級(jí)別:Error Highn 違規(guī)示例代碼:public boolean getFoo(); / badn 合法代碼示例: public boolean isFoo(); / ok2.1.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 ForLoopsMustUseBracesn 規(guī)則級(jí)別:warn Highn 違規(guī)示例代碼:1、 if語句違例代碼if (foo) x+;2、 else語句違例代碼 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.1.5 類必須包含在包里,禁止出現(xiàn)無包的類n 規(guī)范描述:包是java中類所在命名空間,用于類載入時(shí),虛擬機(jī)快速定位并查找該類;如果一個(gè)無包類,在類載入時(shí),耗時(shí)較多,并且很可能無法找到該類。n PMD規(guī)則名稱: NoPackagen 規(guī)則級(jí)別:error High2.1.6 類和方法必須擁有注釋,注釋量占總體代碼25%以上,類頭部,以及方法頭部的注釋應(yīng)符合javadoc標(biāo)準(zhǔn)。n 規(guī)范描述:注釋多少是評(píng)價(jià)代碼質(zhì)量好壞的一個(gè)標(biāo)準(zhǔn),25%是符合國際上對(duì)java注釋的標(biāo)準(zhǔn);對(duì)于類頭部注釋,方法頭部注釋符合javadoc標(biāo)準(zhǔn),可java工具自動(dòng)根據(jù)源碼生成相應(yīng)的java幫助文檔。對(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 DataFileParse2、 方法頭部注釋規(guī)范/* 判斷該時(shí)間是否在統(tǒng)計(jì)時(shí)區(qū)里面* 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)部的注釋通過“/”注釋public class GeneralStat implements IStat/解析數(shù)據(jù)格式的分隔符號(hào)private String separator = ","/開始統(tǒng)計(jì)序號(hào)private int startNum = 1;2.2 基本語法2.2.1 不能隨意捕捉異常,原則上誰捕捉誰處理n 規(guī)范描述:Java程序運(yùn)行過程中產(chǎn)生異常,意味著有錯(cuò)誤產(chǎn)生,捕捉該異常,就需要對(duì)該異常進(jìn)行處理:例如記錄日志,事務(wù)回滾等,如果僅捕獲而不處理,人為的屏蔽異常,調(diào)用該函數(shù),可能為調(diào)用者帶來困惑,調(diào)用者極可能認(rèn)為該方法正常運(yùn)行而做出錯(cuò)誤的判斷。一般來說,異常處理機(jī)制屬于應(yīng)用程序總體框架的一部分,一個(gè)良好的異常處理機(jī)制可以避免系統(tǒng)產(chǎn)生的一些不可預(yù)測(cè)的結(jié)果,并提高代碼可讀性,可維護(hù)性,從而提高代碼的質(zhì)量。本規(guī)則要對(duì)異常處理進(jìn)行檢查,對(duì)一些捕捉后不處理,或者直接將該異常拋出等進(jìn)行預(yù)警。n PMD規(guī)則名稱: EmptyCatchBlockn 規(guī)則級(jí)別:Warn Highn 違規(guī)示例代碼:public void doSomething() try doSomething; catch (IOException ioe) / 獲取異常后沒有做任何處理 n 合法代碼示例: public static int parseInt(String value, int defaultValue)if (isNull(value)return defaultValue;tryreturn 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)有相應(yīng)的邏輯處理,不能為空。n 規(guī)范描述:在if,while,try,finally,switch,synchronized,static Initializer中處理邏輯部分如果為空,很可能這段代碼無任何作用,是段廢棄的代碼,這段代碼的存在不僅對(duì)代碼維護(hù)帶來疑惑,降低了整體的代碼質(zhì)量。n PMD規(guī)則名稱:EmptyIfStmtEmptyWhileStmtEmptyTryBlockEmptyFinallyBlock EmptySwitchStatementsEmptySynchronizedBlockEmptyStaticInitializern 規(guī)則級(jí)別:Warn Highn 違規(guī)示例代碼:1. if語句中為空if (foo) 2. while語句中為空 while(x<100) 3. try,finally中為空tryfinally4. switch中為空switch(value)5. synchronized中為空synchronized(this)6. static Initializer為空static2.2.3 在處理循環(huán)中,不能在程序中人為的改變步長。n 規(guī)范描述:在循環(huán)中對(duì)步長變量人為的改變,很有可能喪失對(duì)步長的控制,導(dǎo)致運(yùn)行時(shí)出現(xiàn)一些不可預(yù)測(cè)的結(jié)果。該規(guī)則是限制開發(fā)者對(duì)這種場(chǎng)景的使用,畢竟步長在多個(gè)地方改變,開發(fā)者很容易沒有考慮全面,導(dǎo)致在特殊情況下出錯(cuò)。n PMD規(guī)則名稱:JumbledIncrementer n 規(guī)則級(jí)別:Errorn 違規(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"); 2.2.4 將簡單類型int,short,float,double等轉(zhuǎn)化成字符串時(shí),需使用其對(duì)應(yīng)類的toString方法。n 規(guī)范描述:將java中簡單類型轉(zhuǎn)換成字符串時(shí),如果采用先轉(zhuǎn)換成對(duì)應(yīng)的類型的對(duì)象,然后通過值對(duì)象轉(zhuǎn)換成字符串,該過程將產(chǎn)生兩個(gè)對(duì)象的創(chuàng)建,而直接采用對(duì)應(yīng)類型的toString方法,只產(chǎn)生一個(gè)對(duì)象的創(chuàng)建,其效率是前者的兩倍。n PMD規(guī)則名稱:UnnecessaryConversionTemporary n 規(guī)則級(jí)別:Error Highn 違規(guī)示例代碼:1、 整形轉(zhuǎn)字符int value=1;String v=new Integer(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);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ì)象是否相等,缺省的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 Highn 違規(guī)示例代碼:/該AgcDataInfo沒有override equals方法public class AgcDataInfo 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 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 AgcDataInfo(“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 AgcDataInfo(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.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 planUnitNo) 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.put(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)生一些不可預(yù)測(cè)的結(jié)果。n PMD規(guī)則名稱:DoubleCheckLockn 規(guī)則級(jí)別:Error Highn 違規(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(); 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è),其他地方返回值可能無效。n PMD規(guī)則名稱:ReturnFromFinallyBlock n 規(guī)則級(jí)別:Error Highn 違規(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) int 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í)例化具有更高的效率。n PMD規(guī)則名稱:BooleanInstantiationn 規(guī)則級(jí)別:Error Highn 違規(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)用使用valueOfn 規(guī)范描述:Integer,Byte,Short,Long實(shí)例化時(shí)使用valueOf具有更高的效率。n PMD規(guī)則名稱:IntegerInstantiationByteInstantiationShortInstantiationLongInstantiation n 規(guī)則級(jí)別:Error Highn 違規(guī)示例代碼:Integer v=new Integer(1);Byte v=new Byte(1);Short v=new Short(1);Long v=new Long(1);n 合法代碼示例:Integer 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語句嵌套的情況下能夠整合盡量整合。n 規(guī)范描述:對(duì)于多個(gè)if語句嵌套的情況下能夠整合必須根據(jù)情況整合。n PMD規(guī)則名稱:CollapsibleIfStatements n 規(guī)則級(jí)別:Errorn 違規(guī)示例代碼:void bar() if (x) if (y) / do stuff 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ī)則級(jí)別:Error Highn 違規(guī)示例代碼:public 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接口來說,使用toArray轉(zhuǎn)數(shù)據(jù)時(shí),如果沒有指明類型,將返回Object,而不能使用類似(Integer)list.toArray()進(jìn)行強(qiáng)轉(zhuǎn)成其他類型的數(shù)組,需要類似toArray(new Integerlist.size()方式進(jìn)行轉(zhuǎn)換。n PMD規(guī)則名稱:ClassCastExceptionWithToArray n 規(guī)則級(jí)別:Error Highn 違規(guī)示例代碼: Collection c=new ArrayList();Integer obj=new Integer(1);c.add(obj);/ this would trigger the rule (and throw a ClassCastExceptionif executed)Integer a=(Integer )c.toArray();n 合法代碼示例:Collection c=new ArrayList();Integer obj=new Integer(1);c.add(obj);/ this wouldnt trigger the ruleInteger b=(Integer )c.toArray(new Integerc.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ì)變成.1000000000000000055511151231257827021181583404541015625,這樣會(huì)導(dǎo)致業(yè)務(wù)計(jì)算造成偏差。n PMD規(guī)則名稱:AvoidDecimalLiteralsInBigDecimalConstructorn 規(guī)則級(jí)別:Error Highn 違規(guī)示例代碼:/ this would trigger the rule BigDecimal bd=new BigDecimal(1.123);n 合法代碼示例: / this wouldnt trigger the rule BigDecimal bd=new BigDecimal("1.123");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 Highn 違規(guī)示例代碼: BigDecimal bd=new BigDecimal(10); bd.add(new BigDecimal(5); / bd仍然為10n 合法代碼示例:BigDecimal bd=new BigDecimal(10);bd = bd.add(new BigDecimal(5); / bd為152.2.15 需要注意的引起NullException的語句。n 規(guī)范描述:對(duì)空指針對(duì)象進(jìn)行操作時(shí),會(huì)拋出NullException異常,該規(guī)則則是在代碼編寫以及代碼健全性上避免這些導(dǎo)致空指針異常的場(chǎng)景,規(guī)則如下:使用equals時(shí),常量應(yīng)該放在前面,例如常量.equals(對(duì)象);判非空:string!=null&&string.length()>0;判空: string=null|string.length()<=0;執(zhí)行類似equals語句:a!=null&&a.equals(b);禁止使用equals(null)方式n PMD規(guī)則名稱:MisplacedNullCheckUnusedNullCheckInEqualsBrokenNullCheck n 規(guī)則級(jí)別:Error Highn 違規(guī)示例代碼:1、 空指針檢查錯(cuò)位if (a.equals(baz) && a != null) ;if (a.equals(baz) | a = null) ;2、 無用的空指針檢查if (a!=null && b.equals(a) / 該處雖然對(duì)a對(duì)象進(jìn)行了檢查,但沒有對(duì)b進(jìn)行檢查/whatever3、 常見的判空,判非空代碼編寫上的錯(cuò)誤/判非空,卻使用了|if (string!=null | !string.equals("")return string;/判空卻用了&& if (string=null && string.equals("")return string;4、 比較對(duì)象是否為空,使用了equalsstr.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)行檢查/whatever3、 常見的判空,判非空代碼編寫上的錯(cuò)誤/判非空用了&&if (string!=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ù)庫進(jìn)行查詢操作,取得結(jié)果集合ResultSet對(duì)象,使用next,讓游標(biāo)定位到下一行,下一行不存在時(shí),next()返回false,該規(guī)則這是強(qiáng)制對(duì)下一行是否用記錄進(jìn)行判斷,根據(jù)結(jié)果進(jìn)行后續(xù)操作。n PMD規(guī)則名稱:CheckResultSet n 規(guī)則級(jí)別:Error Highn 違規(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.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ì)字符串操作按照合適的規(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(),這樣減少一個(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ī)則名稱:UseEqualsToCompareStringsUseStringBufferLengthUnnecessaryCaseChangeUseStringBufferLenStringToString n 規(guī)則級(jí)別:Error Highn 違規(guī)示例代碼:1、 字符串比較if(str1=str2) 2、 字符串相加String str=str1+str2+str3+str4;3、 大小寫不敏感字符串比較str1.toUpperCase().equals(str2.toUpperCase();4、 取StringBuffer

注意事項(xiàng)

本文([計(jì)算機(jī)軟件及應(yīng)用]Java開發(fā)規(guī)范)為本站會(huì)員(仙***)主動(dòng)上傳,裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng)(點(diǎn)擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因?yàn)榫W(wǎng)速或其他原因下載失敗請(qǐng)重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!