代码检查规则:Java语言案例详解
本節(jié)課程為《代碼檢查規(guī)則:Java語(yǔ)言案例詳解》, 通常情況下Java的代碼檢查規(guī)則可以分為以下十類:
接下來(lái),讓我們具體來(lái)看看每個(gè)分類的內(nèi)容。
一、源文件規(guī)范
該類規(guī)范主要從文件名、文件編碼、特殊字符三個(gè)方面制定的規(guī)則。
01
文件名
Java源文件名必須和它包含的頂層類名保持一致,包括大小寫,并以.java作為后綴名。
02
文件編碼
為保持編碼風(fēng)格的一致性,避免編碼不一致導(dǎo)致的亂碼問題,要求所有源文件編碼必須使用UTF-8格式。
03
特殊字符
特殊字符方面的規(guī)則主要是針對(duì)換行、縮進(jìn)、空格等操作而制定,有以下強(qiáng)制規(guī)定:
①除換行符以外,ASCII空格(0x20)是唯一合法的空格字符。
②由于不同系統(tǒng)將Tab轉(zhuǎn)化成空格的數(shù)目不一致,統(tǒng)一使用空格進(jìn)行縮進(jìn)。
③文件的換行符統(tǒng)一使用Unix格式(\n),而不要使用Windows格式(\r\n)。
二、源文件組織結(jié)構(gòu)規(guī)范
這一大類規(guī)則主要規(guī)定了源文件所應(yīng)包含的具體組成部分和各個(gè)部分之間應(yīng)遵循的一系列規(guī)則。
對(duì)于源文件的組成部分,規(guī)定如下:
源文件必須按順序包含:許可證或版權(quán)聲明、package語(yǔ)句、import語(yǔ)句、唯一的頂層類,四個(gè)方面的內(nèi)容。同時(shí),每?jī)蓚€(gè)部分之間用一個(gè)空行進(jìn)行分隔,不允許出現(xiàn)多余空行。對(duì)于以上四個(gè)方面的內(nèi)容,每個(gè)組成部分又有相應(yīng)的編碼規(guī)則。
01
許可證或版權(quán)聲明規(guī)范
如果文件有許可證或版權(quán)聲明,應(yīng)放在最開頭,如果沒有,可以忽略。
02
package語(yǔ)句規(guī)范
package語(yǔ)句一定單獨(dú)占一行不換行,允許該行超出Java的120字符列寬限制。
03
import語(yǔ)句規(guī)范
①對(duì)于所有非靜態(tài)導(dǎo)入,禁止使用通配符import。
②所有未使用的import語(yǔ)句均應(yīng)刪除,并且與package語(yǔ)句相同。
③每條import語(yǔ)句單獨(dú)占據(jù)一行不換行,允許超出120字符列寬限制。
04
類聲明規(guī)范
①每個(gè)源文件只允許包含唯一一個(gè)頂層類。若需要定義其他的類,可將多余的類放在另外一個(gè)獨(dú)立的源文件中,或者可將其作為一個(gè)內(nèi)部類,定義在頂層類中來(lái)使用。
②重載的方法必須放在一起,即同名的構(gòu)造函數(shù)或方法之間禁止插入其他成員。
三、代碼結(jié)構(gòu)規(guī)范
這一部分規(guī)則主要是對(duì)花括號(hào)(即大括號(hào))、縮進(jìn)與換行、空行的一系列規(guī)范和一些其他說明。
01
花括號(hào)
花括號(hào)經(jīng)常在類和方法定義以及代碼塊劃分中使用,花括號(hào)在使用中常需要合理的換行操作進(jìn)行配合。規(guī)定為:在非空代碼塊中使用花括號(hào)時(shí)要遵循K&R風(fēng)格(Kernighan and Ritchie Style),三個(gè)主要原則為:
①在左花括號(hào)({)前不能換行,在其后換行;
②在右花括號(hào)(})前應(yīng)有換行;
③表示終止的右花括號(hào)(})后必須換行,否則,右花括號(hào)后不換行。
02
縮進(jìn)與換行
縮進(jìn)與換行主要是為了保證代碼風(fēng)格的一致性,提升代碼的可維護(hù)性。主要規(guī)范有:
①每次開始書寫一個(gè)新代碼塊時(shí),使用4個(gè)空格進(jìn)行縮進(jìn),在代碼塊結(jié)束時(shí),恢復(fù)之前的縮進(jìn)級(jí)別。
②每條語(yǔ)句之后都要換行,每行只能有一條完整語(yǔ)句。
③除package語(yǔ)句和import語(yǔ)句外,代碼單行字符數(shù)限制不超過120個(gè)。超出則需要換行,換行時(shí),遵循如下五條原則:
→ 第二行相對(duì)第一行縮進(jìn)四個(gè)空格,從第三行開始,不再繼續(xù)縮進(jìn)。
→ 運(yùn)算符與下文一起換行,即運(yùn)算符位于行首。
→ 方法調(diào)用的標(biāo)點(diǎn)符號(hào)與下文一起換行。
→ 方法調(diào)用中的多個(gè)參數(shù)需要換行時(shí),在逗號(hào)后進(jìn)行。
→ 在括號(hào)前不要換行。
03
空行
合理使用空行可以提高代碼的可讀性,有利于后期維護(hù)。
對(duì)于空行的使用,有如下規(guī)范進(jìn)行約束:
①在類的不同成員間增加空行,包括:成員變量、構(gòu)造函數(shù)、方法、內(nèi)部類、靜態(tài)初始化塊、實(shí)例初始化塊等。
②兩個(gè)成員變量聲明之間可以不加空行。空行通常對(duì)于成員變量進(jìn)行邏輯分組。
③方法體內(nèi),按需增加空行,以便從邏輯上對(duì)語(yǔ)句進(jìn)行分組。
④使用空行時(shí),禁止使用連續(xù)的空行。
04
其他說明
Java中有兩種數(shù)組定義形式,為規(guī)范代碼書寫形式,要求為:
①類型與中括號(hào)緊挨相連來(lái)表示數(shù)組,即中括號(hào)寫在數(shù)組名之前。
而當(dāng)注解與注釋同時(shí)存在時(shí),統(tǒng)一的規(guī)范要求為:
②添加在類、方法、構(gòu)造函數(shù)、成員屬性上的注解直接寫在注釋塊之后,每個(gè)注解獨(dú)占一行。
當(dāng)同時(shí)存在多個(gè)修飾符時(shí),需要按照順序書寫,順序要求如下:
public protected private abstract static final transient volatile synchronized native strictfp
排在首位的一定是訪問修飾符,隨后是abstract,即抽象類或抽象方法,緊接著是static、final。這是常見的幾類修飾符,對(duì)于其他的修飾符,可以參考以上列舉的順序進(jìn)行書寫。
為避免小寫字母l與1混淆,有如下規(guī)定:
長(zhǎng)整型數(shù)字必須使用大寫字母L結(jié)尾,以便于和數(shù)字1進(jìn)行區(qū)分。
四、命名規(guī)范
在Java中無(wú)論是方法名還是類名,均需使用駝峰命名格式進(jìn)行命名。
01
駝峰命名格式
對(duì)于兩種駝峰命名格式的使用范圍,有如下規(guī)范:
①方法名、參數(shù)名、成員變量、局部變量都統(tǒng)一使用lowerCamelCase風(fēng)格,即首字母小寫的駝峰命名格式。
②類名使用UpperCamelCase風(fēng)格,即首字母大寫的駝峰命名格式,以下情形例外:DO/BO/DTO/VO/AO/PO/UID等。
02
類的命名格式
除此之外,對(duì)于一些類,命名格式有更加具體的規(guī)范要求:
①抽象類命名使用Abstract或Base開頭;
②異常類命名使用Exception結(jié)尾;
③測(cè)試類命名以它要測(cè)試的類的名稱開始,以Test結(jié)尾。
03
常量命名格式
而對(duì)于常量的命名,規(guī)范與上所述有所不同:
①常量命名全部大寫,單詞間用下劃線隔開。
②不允許任何未經(jīng)預(yù)先定義的常量直接出現(xiàn)在代碼中。
五、OOP規(guī)約
OOP規(guī)約主要是針對(duì)面向?qū)ο缶幊踢^程中定義的一些類所制定的一些規(guī)則。
包含的強(qiáng)制規(guī)范要求有:
①所有的POJO類屬性必須使用包裝數(shù)據(jù)類型,禁止使用基本類型。
②所有的覆寫方法,必須加@Override注解。
③Object的equals方法容易拋空指針異常,應(yīng)使用常量或確定有值的對(duì)象來(lái)調(diào)用equals。
④定義DO/DTO/VO等POJO類時(shí),均不要設(shè)定任何屬性默認(rèn)值。
六、集合處理規(guī)范
集合和數(shù)組是我們開發(fā)過程中使用頻度最高的兩個(gè)數(shù)據(jù)結(jié)構(gòu),對(duì)于二者的使用也有嚴(yán)格的強(qiáng)制規(guī)范:
①當(dāng)需要將集合轉(zhuǎn)換為數(shù)組時(shí),必須使用集合的toArray方法,傳入的是類型完全一樣的數(shù)組,大小是list.size()。
②對(duì)一個(gè)集合求子集合時(shí),需高度注意對(duì)原集合元素的增加或刪除,均會(huì)導(dǎo)致子列表的遍歷、增加、刪除,產(chǎn)生ConcurrentModificationException異常。應(yīng)通過對(duì)子集合進(jìn)行相應(yīng)操作,來(lái)反射到原集合,從而避免異常的發(fā)生。
③不要在循環(huán)體內(nèi)部進(jìn)行集合元素的remove/add操作。remove元素請(qǐng)使用Iterator(迭代器)方式,如果并發(fā)操作,需要對(duì)Iterator對(duì)象加鎖。
七、控制語(yǔ)句規(guī)范
Java中的控制語(yǔ)句主要有switch、if、else、while等,這些語(yǔ)句的使用在編碼過程中需要遵循以下規(guī)范:
①在一個(gè)switch塊內(nèi),每個(gè)case要么通過break/return等來(lái)終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個(gè)case為止;在一個(gè)switch快內(nèi),都必須包含一個(gè)default語(yǔ)句并且放在最后。
②使用if/else/for/while/do語(yǔ)句必須使用花括號(hào)。即使只有一行代碼,避免采用單行的編碼方式。
③在高并發(fā)場(chǎng)景中,避免使用“等于”判斷作為中斷或退出的條件。防止在擊穿現(xiàn)象下,程序無(wú)法正常中斷或退出的情況發(fā)生。
八、注釋規(guī)約
合理使用注釋可以提高程序可讀性,便于后期維護(hù)。注釋可以是程序說明,也可以是編程思路。Java中的注釋主要分三種形式:文檔注釋、單行注釋和多行注釋。注釋規(guī)約包括:
①類、類屬性、類方法的注釋必須使用文檔注釋形式,即使用 /內(nèi)容/ 格式,不得使用單行注釋的格式。單行注釋和多行注釋主要使用在方法體內(nèi)。
②方法內(nèi)部單行注釋,在被注釋語(yǔ)句上方另起一行,使用//注釋。方法內(nèi)部多行注釋,使用/內(nèi)容/注釋,注意與代碼對(duì)齊。
九、異常處理規(guī)范
在Java中,我們通常使用try catch來(lái)進(jìn)行捕獲異常處理,而Java中的異常又分為運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常。
① 對(duì)于處理運(yùn)行時(shí)異常,有如下規(guī)范:Java類庫(kù)中定義的可以通過預(yù)檢查方式規(guī)避的RuntimeException異常不應(yīng)該通過try catch的方式來(lái)處理,比如:空指針異常和數(shù)組越界異常等等。
② 對(duì)于捕獲后異常的處理,有如下規(guī)范:捕獲異常是為了處理異常,不要捕獲后不進(jìn)行任何處理而將其拋棄。若不想進(jìn)行異常的處理,應(yīng)將該異常拋給它的調(diào)用者。最外層的業(yè)務(wù)使用者必須處理異常,將其轉(zhuǎn)化為用戶可以理解的內(nèi)容。即對(duì)于捕獲后的異常,要么繼續(xù)向上拋,要么自己進(jìn)行處理。
③異常處理的規(guī)范要求還包括:不能在finally塊中使用return語(yǔ)句。
十、缺陷檢查規(guī)則
缺陷檢查主要是對(duì)Java源代碼進(jìn)行靜態(tài)分析,掃描其中潛在的缺陷,比如:空指針異常、死循環(huán)等,這一階段所應(yīng)遵循的規(guī)則包括:
①不能使用單個(gè)字符定義StringBuffer和StringBuilder。
②任何上鎖的對(duì)象均需保證其鎖可以被釋放。
③嚴(yán)格避免死循環(huán)的發(fā)生。
④對(duì)于字符串中的點(diǎn)號(hào)(“.”)、豎線(“|”)和文件分隔符(“File.separator”)進(jìn)行替代時(shí),需要注意其特殊含義。
“.”:匹配任意單個(gè)字符。在replaceAll中使用,它匹配所有內(nèi)容。
“|”:通常用作選項(xiàng)分隔符,它匹配字符間的空格
“File.separator”:匹配特定平臺(tái)的文件路徑分隔符。在Windows上,這將被視為轉(zhuǎn)義字符。
⑤當(dāng)synchronize對(duì)成員變量進(jìn)行上鎖時(shí),該成員變量必須是final類型的。
⑥synchronize上鎖的成員變量類型一定不能是裝箱類型。
⑦所有被spring托管的類,其成員屬性的初始化均要使用注入的方式。
⑧當(dāng)使用try catch方式進(jìn)行異常捕獲,且需要在catch中對(duì)異常信息進(jìn)行輸出時(shí),不得使用printStackTrace的方式。這種方式會(huì)導(dǎo)致后期分析代碼困難。而應(yīng)采用一些Log框架,方便用戶檢索和瀏覽日志。
⑨方法返回值包含操作狀態(tài)代碼時(shí),該狀態(tài)碼不應(yīng)被忽略
⑩【%s】數(shù)組具有協(xié)變性,元素賦值類型與初始化類型不一致,此種情況可通過編譯,但運(yùn)行階段會(huì)發(fā)生錯(cuò)誤。
?對(duì)于用戶名和密碼不應(yīng)直接寫在Java的文件中,避免泄露。而應(yīng)將相應(yīng)關(guān)鍵信息寫在配置文件中進(jìn)行讀取。
?方法和成員變量的命名不應(yīng)相同,也不應(yīng)通過大小寫來(lái)進(jìn)行區(qū)分。
關(guān)于Java的十類代碼檢查規(guī)則
今天就講解到這了
學(xué)完是不是感覺掌握了一個(gè)億!
總結(jié)
以上是生活随笔為你收集整理的代码检查规则:Java语言案例详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单元测试实践
- 下一篇: vilatile 深入理解java虚拟机