在上一篇的java編程規(guī)范(一)中我們講述了在Java編碼中的一般原則腥沽,雖然這些原則并不涉及具體的代碼規(guī)范,但是這些原則卻是我們?cè)贘ava開發(fā)過程中所應(yīng)該遵循的規(guī)范與思想漾狼。今天我們將學(xué)習(xí)一些涉及具體代碼書寫的格式規(guī)范重慢。
二、格式規(guī)范
(一)縮進(jìn)嵌套的代碼
為了增強(qiáng)代碼的可讀性逊躁,我們常常把一些單獨(dú)的語句組織成語句塊似踱,并對(duì)各塊統(tǒng)一縮進(jìn)使之與周圍代碼分開。
1、如果我們使用開發(fā)環(huán)境核芽,則我們可以使用開發(fā)環(huán)境提供的縮進(jìn)樣式囚戚。但是如果我們是手寫代碼,應(yīng)該使用兩個(gè)空格縮進(jìn)轧简。
class MyFuction {
··void function(int arg) {
····if (arg < 0) {
······for (int i = 0; i <= arg; i++) {
········// ...
······}
····}
··}
}
2驰坊、塊語句起始端的大括號(hào)應(yīng)該放在引入塊語句那一行的最后,結(jié)束端的大括號(hào)要獨(dú)占一行哮独,并且與引入嵌套語句那一行的第一個(gè)字母對(duì)齊拳芙。我們?nèi)粘J褂玫拇a規(guī)范如下:
類定義:
public class MyClass {
...
}
內(nèi)部類定義:
public class OuterClass {
···
class InnerClass {
...
}
}
方法定義:
void method(int j) {
···
}
for循環(huán)語句:
for (int i = 0; i <= j; i++) {
···
}
if-else語句:
if (j < 0) {
···
}
else if ( j > 0) {
···
}
else {
···
}
try,catch,finally塊:
try {
···
}
catch {
···
}
finally {
···
}
switch語句:
switch (value) {
case 0:
···
break;
default:
···
break;
}
while語句:
while (a < b) {
···
}
do-while語句:
do {
···
} while (a < b);
為了提高一個(gè)團(tuán)隊(duì)的工作效率,不要讓每個(gè)組員任意選擇各自代碼里的縮進(jìn)量及樣式皮璧,應(yīng)該制定統(tǒng)一的一套標(biāo)準(zhǔn)的縮進(jìn)規(guī)則舟扎,并且確保團(tuán)隊(duì)里的每個(gè)人都遵循這個(gè)標(biāo)準(zhǔn)。
(二)斷開長(zhǎng)句
盡管在窗口化的現(xiàn)代編輯器中悴务,可以利用橫向滾動(dòng)條來閱讀很長(zhǎng)的單行代碼浆竭。但是打印機(jī)對(duì)于超過它最大打印寬度的語句,就會(huì)把它們截?cái)嗖沂佟Q行或者打印在不同的頁(yè)上邦泄。因此,要把每行代碼的長(zhǎng)度限制在打印環(huán)境所支持的最大寬度之內(nèi)裂垦,這個(gè)值一般是80或者132個(gè)字符顺囊。
1、不要把多個(gè)語句放在同一行里以免超過最大可接受寬度蕉拢。應(yīng)該一條語句放置在一行里特碳。
// 這樣寫太長(zhǎng)
double x = Math.random(); double y = Math.random();
// 應(yīng)該一句占一行
double x = Math.random();
double y = Math.random();
2、如果一行代碼中包含了復(fù)雜的表達(dá)式晕换,就應(yīng)該把它拆分為幾個(gè)短小的子表達(dá)式午乓,每個(gè)子表達(dá)式的運(yùn)算結(jié)果存儲(chǔ)在一個(gè)臨時(shí)變量里,并且單獨(dú)放置在一行闸准。
// 這樣的表達(dá)式太長(zhǎng)
double length = Math.sqrt(Math.pow(Math.random(),2.0),Math.pow(Math.random(),2.0));
// 應(yīng)該按下面這樣拆分
double x = Math.pow(Math.random(),2.0);
double y = Math.pow(Math.random(),2.0);
double length = Math.sqrt(x + y);
(三) 使用空白
空白就是頁(yè)面上沒有可見字符的區(qū)域益愈。代碼里如果空白太少就會(huì)不易閱讀和理解,所以應(yīng)該使用足夠多的空白把方法夷家、注釋蒸其、代碼塊和表達(dá)式展示清楚。
1库快、以下情況使用單空白來分隔:
(1)摸袁、右括號(hào)")"或者緊隨其后的關(guān)鍵字;關(guān)鍵字和緊隨其后的左括號(hào)"("或者"{"义屏;右括號(hào)")"和緊隨其后的左括號(hào)"{";其實(shí)細(xì)心的讀者會(huì)發(fā)現(xiàn)在上述內(nèi)容的介紹中已經(jīng)應(yīng)用了這些規(guī)范靠汁,在此就不贅述了蜂大。
if (j < 0) {
···
}
else if ( j > 0) {
···
}
else {
···
}
(2)、除了"."之外的運(yùn)算符與其前后的表達(dá)式之間蝶怔。
double length = Math.sqrt(x * x + y * y);
double x = length > 0.0 ? (x / length) : x;
2县爬、以下情況應(yīng)該使用空行來分隔:
(1) 每個(gè)邏輯上獨(dú)立的方法實(shí)現(xiàn)之間
void handleInfo(Message message) {
DataInput content = message.getDataInput();
int messageType = content.readInt();
switch (messageType) {
case warning:
...
break;
case error:
...
break;
default:
...
break;
}
}
(2) 定義類或者接口時(shí),每個(gè)成員之間使用空行
public class Car {
class InnerCar {
...
}
private Bar bar;
Foo(Bar bar) {
this.bar = bar;
}
}
(3) 源文件中添谊,每個(gè)類和接口的定義之間要使用空行
interface Paly {
...
}
public class Person implements Play{
...
}
(四)不要直接使用Tab控制符
不同的環(huán)境對(duì)Tab控制符的解釋也是不同的财喳,代碼的格式在原來的編輯環(huán)境下可能正確無誤,但是如果放到另一個(gè)對(duì)Tab控制符有不同解釋的系統(tǒng)中斩狱,可能格式混亂耳高、無法閱讀。
為了避免出現(xiàn)以上的情況所踊,我們應(yīng)該使用空格來縮進(jìn)代碼泌枪。在一個(gè)團(tuán)隊(duì)中,應(yīng)該設(shè)置團(tuán)隊(duì)通用的縮進(jìn)標(biāo)準(zhǔn)秕岛,并且團(tuán)隊(duì)里的所有人都嚴(yán)格遵守這個(gè)標(biāo)準(zhǔn)碌燕。