Java語言編碼規(guī)范(翻譯自SUN官方文檔)

翻譯自SUN (Oracle) 官方文檔Code Conventions for the Java Programming Language

Java語言編碼規(guī)范

1 介紹(Introduction)

1.1 為什么要有編碼規(guī)范(Why Have Code Conventions)
編碼規(guī)范對于程序員而言尤為重要往踢,有以下幾個(gè)原因:

  • 一個(gè)軟件的生命周期中秒紧,80%的花費(fèi)在于維護(hù)
  • 幾乎沒有任何一個(gè)軟件训挡,在其整個(gè)生命周期中藤为,均由最初的開發(fā)人員來維護(hù)
  • 編碼規(guī)范可以改善軟件的可讀性,可以讓程序員盡快而徹底地理解新的代碼
  • 如果你將源碼作為產(chǎn)品發(fā)布嚼贡,就需要確任它是否被很好的打包并且清晰無誤狼速,一如你已構(gòu)建的其它任何產(chǎn)品

為了執(zhí)行規(guī)范抬纸,每個(gè)軟件開發(fā)人員必須一致遵守編碼規(guī)范。每個(gè)人弦悉。

1.2 版權(quán)聲明(Acknowledgments)
本文檔反映的是Sun MicroSystems公司窒典,Java語言規(guī)范中的編碼標(biāo)準(zhǔn)部分。主要貢獻(xiàn)者包括:Peter King稽莉,Patrick Naughton瀑志,Mike DeMoney,Jonni Kanerva污秆,Kathy Walrath以及Scott Hommel劈猪。
本文檔現(xiàn)由Scott Hommel維護(hù),有關(guān)評(píng)論意見請發(fā)至shommel@eng.sun.com

2 文件名(File Names)

這部分列出了常用的文件名及其后綴良拼。

2.1 文件后綴(File Suffixes)
Java程序使用下列文件后綴:

  • Java源文件 :.java
  • Java字節(jié)碼文件:.class

2.2 常用文件名(Common File Names)
常用的文件名包括:

  • GNUmakefile:makefiles的首選文件名战得。我們采用gnumake來創(chuàng)建(build)軟件。
  • README:概述特定目錄下所含內(nèi)容的文件的首選文件名
3 文件組織(File Organization)

一個(gè)文件由被空行分割而成的段落以及標(biāo)識(shí)每個(gè)段落的可選注釋共同組成将饺。超過2000行的程序難以閱讀贡避,應(yīng)該盡量避免。"Java源文件范例"提供了一個(gè)布局合理的Java程序范例予弧。

3.1 Java源文件(Java Source Files)
每個(gè)Java源文件都包含一個(gè)單一的公共類或接口刮吧。若私有類和接口與一個(gè)公共類相關(guān)聯(lián),可以將它們和公共類放入同一個(gè)源文件掖蛤。公共類必須是這個(gè)文件中的第一個(gè)類或接口杀捻。
Java源文件還遵循以下規(guī)則:

  • 開頭注釋
  • 包和引入語句
  • 類和接口聲明

3.1.1 開頭注釋(Beginning Comments)
所有的源文件都應(yīng)該在開頭有一個(gè)C語言風(fēng)格的注釋,其中列出類名蚓庭、版本信息致讥、日期和版權(quán)聲明:

/* 
 * Classname 
 * 
 * Version information 
 * 
 * Date 
 * 
 * Copyright notice 
 */  

3.1.2 包和引入語句(Package and Import Statements)
在多數(shù)Java源文件中仅仆,第一個(gè)非注釋行是包語句。在它之后可以跟引入語句垢袱。例如:

package java.awt;     

import java.awt.peer.CanvasPeer;  
4 縮進(jìn)排版(Indentation)

4個(gè)空格常被作為縮進(jìn)排版的一個(gè)單位墓拜。縮進(jìn)的確切解釋并未詳細(xì)指定(空格 vs. 制表符)请契。一個(gè)制表符等于8個(gè)空格(而非4個(gè))咳榜。

4.1 行長度(Line Length)
盡量避免一行的長度超過80個(gè)字符,因?yàn)楹芏嘟K端和工具不能很好處理之爽锥。
注意:用于文檔中的例子應(yīng)該使用更短的行長涌韩,長度一般不超過70個(gè)字符。

4.2 換行(Wrapping Lines)
當(dāng)一個(gè)表達(dá)式無法容納在一行內(nèi)時(shí)氯夷,可以依據(jù)如下一般規(guī)則斷開之:

  • 在一個(gè)逗號(hào)后面斷開
  • 在一個(gè)操作符前面斷開
  • 寧可選擇較高級(jí)別(higher-level)的斷開臣樱,而非較低級(jí)別(lower-level)的斷開
  • 新的一行應(yīng)該與上一行同一級(jí)別表達(dá)式的開頭處對齊
  • 如果以上規(guī)則導(dǎo)致你的代碼混亂或者使你的代碼都堆擠在右邊,那就代之以縮進(jìn)8個(gè)空格腮考。

以下是斷開方法調(diào)用的一些例子:

someMethod(longExpression1, longExpression2, longExpression3,  
           longExpression4, longExpression5);  
  
var = someMethod1(longExpression1,  
                  someMethod2(longExpression2,  
                              longExpression3));  

以下是兩個(gè)斷開算術(shù)表達(dá)式的例子雇毫。前者更好,因?yàn)閿嚅_處位于括號(hào)表達(dá)式的外邊秸仙,這是個(gè)較高級(jí)別的斷開嘴拢。

longName1 = longName2 * (longName3 + longName4 - longName5)  
            + 4 * longname6; //PREFFER  
  
longName1 = longName2 * (longName3 + longName4  
                         - longName5) + 4 * longname6; //AVOID  

以下是兩個(gè)縮進(jìn)方法聲明的例子。前者是常規(guī)情形寂纪。后者若使用常規(guī)的縮進(jìn)方式將會(huì)使第二行和第三行移得很靠右席吴,所以代之以縮進(jìn)8個(gè)空格

//CONVENTIONALINDENTATION  
someMethod(int anArg, Object anotherArg, String yetAnotherArg,  
           Object andStillAnother) {  
    ...  
}  
  
//INDENT 8 SPACESTO AVOID VERY DEEP INDENTS  
private static synchronized horkingLongMethodName(int anArg,  
        Object anotherArg, String yetAnotherArg,  
        Object andStillAnother) {  
    ...  
}  

if語句的換行通常使用8個(gè)空格的規(guī)則,因?yàn)槌R?guī)縮進(jìn)(4個(gè)空格)會(huì)使語句體看起來比較費(fèi)勁捞蛋。比如:

//DON’T USE THISINDENTATION  
if ((condition1&& condition2)  
    || (condition3 && condition4)  
    ||!(condition5 && condition6)) { //BAD WRAPS  
    doSomethingAboutIt();            //MAKE THIS LINE EASY TO MISS  
}  
  
//USE THISINDENTATION INSTEAD  
if ((condition1&& condition2)  
        || (condition3 && condition4)  
        ||!(condition5 && condition6)) {  
    doSomethingAboutIt();  
}  
  
//OR USE THIS  
if ((condition1&& condition2) || (condition3 && condition4)  
        ||!(condition5 && condition6)) {  
    doSomethingAboutIt();  
}  

這里有三種可行的方法用于處理三元運(yùn)算表達(dá)式:

alpha = aLongBooleanExpression) ? beta : gamma;  
  
alpha = (aLongBooleanExpression) ? beta  
                                 : gamma;  
   
alpha = (aLongBooleanExpression)  
        ? beta  
        : gamma;  
5 注釋(Comments)

Java程序有兩類注釋:實(shí)現(xiàn)注釋(implementation comments)和文檔注釋(document comments)孝冒。實(shí)現(xiàn)注釋是那些在C++中見過的,使用/.../和//界定的注釋拟杉。文檔注釋(被稱為"doc comments")是Java獨(dú)有的庄涡,并由/*.../界定。文檔注釋可以通過javadoc工具轉(zhuǎn)換成HTML文件搬设。
實(shí)現(xiàn)注釋用以注釋代碼或者實(shí)現(xiàn)細(xì)節(jié)穴店。文檔注釋從實(shí)現(xiàn)自由(implementation-free)的角度描述代碼的規(guī)范。它可以被那些手頭沒有源碼的開發(fā)人員讀懂拿穴。
注釋應(yīng)被用來給出代碼的總括泣洞,并提供代碼自身沒有提供的附加信息。注釋應(yīng)該僅包含與閱讀和理解程序有關(guān)的信息默色。例如球凰,相應(yīng)的包如何被建立或位于哪個(gè)目錄下之類的信息不應(yīng)包括在注釋中。
在注釋里,對設(shè)計(jì)決策中重要的或者不是顯而易見的地方進(jìn)行說明是可以的呕诉,但應(yīng)避免提供代碼中己清晰表達(dá)出來的重復(fù)信息缘厢。多余的的注釋很容易過時(shí)。通常應(yīng)避免那些代碼更新就可能過時(shí)的注釋甩挫。
注意:頻繁的注釋有時(shí)反映出代碼的低質(zhì)量贴硫。當(dāng)你覺得被迫要加注釋的時(shí)候,考慮一下重寫代碼使其更清晰伊者。
注釋不應(yīng)寫在用星號(hào)或其他字符畫出來的大框里夜畴。注釋不應(yīng)包括諸如制表符和回退符之類的特殊字符。

5.1 實(shí)現(xiàn)注釋的格式(Implementation Comment Formats)
程序可以有4種實(shí)現(xiàn)注釋的風(fēng)格:塊(block)删壮、單行(single-line)、尾端(trailing)和行末(end-of-line)兑牡。

5.1.1 塊注釋(Block Comments)
塊注釋通常用于提供對文件央碟,方法,數(shù)據(jù)結(jié)構(gòu)和算法的描述均函。塊注釋被置于每個(gè)文件的開始處以及每個(gè)方法之前亿虽。它們也可以被用于其他地方,比如方法內(nèi)部苞也。在功能和方法內(nèi)部的塊注釋應(yīng)該和它們所描述的代碼具有一樣的縮進(jìn)格式洛勉。
塊注釋之首應(yīng)該有一個(gè)空行,用于把塊注釋和代碼分割開來如迟,比如:

/* 
 * Here is ablock comment. 
 */  

塊注釋可以以/*-開頭收毫,這樣indent(1)就可以將之識(shí)別為一個(gè)代碼塊的開始,而不會(huì)重排它殷勘。

/*- 
  * Here is ablock comment with some very special 
  * formatting that I want indent(1) to ignore. 
  * 
  *    one 
  *        two 
  *            three 
  */  

注意:如果你不使用indent(1)此再,就不必在代碼中使用/*-,或?yàn)樗丝赡軐δ愕拇a運(yùn)行indent(1)作讓步玲销。

5.1.2 單行注釋(Single-Line Comments)
短注釋可以顯示在一行內(nèi)输拇,并與其后的代碼具有一樣的縮進(jìn)層級(jí)。如果一個(gè)注釋不能在一行內(nèi)寫完贤斜,就該采用塊注釋策吠。單行注釋之前應(yīng)該有一個(gè)空行。以下是一個(gè)Java代碼中單行注釋的例子:

if (condition) {  
   
    /* Handle thecondition. */  
    ...  
}  

5.1.3 尾端注釋(Trailing Comments)
極短的注釋可以與它們所要描述的代碼位于同一行瘩绒,但是應(yīng)該有足夠的空白來分開代碼和注釋猴抹。若有多個(gè)短注釋出現(xiàn)于大段代碼中,它們應(yīng)該具有相同的縮進(jìn)草讶。
以下是一個(gè)Java代碼中尾端注釋的例子:

if (a == 2) {  
    return TRUE;            /* special case */  
} else {  
    return isPrime(a);      /* works only for odda */  
}  

5.1.4 行末注釋(End-Of-Line Comments)
注釋界定符"http://"洽糟,可以注釋掉整行或者一行中的一部分。它一般不用于連續(xù)多行的注釋文本;然而坤溃,它可以用來注釋掉連續(xù)多行的代碼段拍霜。以下是所有三種風(fēng)格的例子:

if (foo > 1) {  
   
    // Do adouble-flip.  
    ...  
}  
else {  
    return false;          // Explain why here.  
}  
   
//if (bar > 1){  
//  
//    // Do a triple-flip.  
//    ...  
//}  
//else {  
//    return false;  
//}  

5.2 文檔注釋(Documentation Comments)
若想了解更多,參見"How to Write Doc Comments for Javadoc"薪介,其中包含了有關(guān)文檔注釋標(biāo)記的信息(@return, @param, @see):
http://java.sun.com/javadoc/writingdoccomments/index.html
若想了解更多有關(guān)文檔注釋和javadoc的詳細(xì)資料祠饺,參見javadoc的主頁:
http://java.sun.com/javadoc/index.html
文檔注釋描述Java的類、接口汁政、構(gòu)造器道偷,方法,以及字段(field)记劈。每個(gè)文檔注釋都會(huì)被置于注釋定界符/*.../之中勺鸦,一個(gè)注釋對應(yīng)一個(gè)類、接口或成員目木。該注釋應(yīng)位于聲明之前:

/** 
  * The Exampleclass provides ... 
  */  
public classExample { ...  

注意頂層(top-level)的類和接口是不縮進(jìn)的换途,而其成員是縮進(jìn)的。描述類和接口的文檔注釋的第一行(/**)不需縮進(jìn)刽射;隨后的文檔注釋每行都縮進(jìn)1格(使星號(hào)縱向?qū)R)军拟。成員,包括構(gòu)造函數(shù)在內(nèi)誓禁,其文檔注釋的第一行縮進(jìn)4格懈息,隨后每行都縮進(jìn)5格。
若你想給出有關(guān)類摹恰、接口辫继、變量或方法的信息,而這些信息又不適合寫在文檔中戒祠,則可使用實(shí)現(xiàn)塊注釋(見5.1.1)或緊跟在聲明后面的單行注釋(見5.1.2)骇两。例如,有關(guān)一個(gè)類實(shí)現(xiàn)的細(xì)節(jié)姜盈,應(yīng)放入緊跟在類聲明后面的實(shí)現(xiàn)塊注釋中低千,而不是放在文檔注釋中。
文檔注釋不能放在一個(gè)方法或構(gòu)造器的定義塊中馏颂,因?yàn)镴ava會(huì)將位于文檔注釋之后的第一個(gè)聲明與其相關(guān)聯(lián)示血。

6 聲明(Declarations)

6.1 每行聲明變量的數(shù)量(Number Per Line)
推薦一行一個(gè)聲明,因?yàn)檫@樣以利于寫注釋救拉。亦即难审,

int level;  // indentation level  
int size;   // size of table  

要優(yōu)于,

int level, size;  

不要將不同類型變量的聲明放在同一行亿絮,例如:

int foo,  fooarray[];  //WRONG!  

注意:上面的例子中告喊,在類型和標(biāo)識(shí)符之間放了一個(gè)空格麸拄,另一種被允許的替代方式是使用制表符:

int          level;         // indentation level  
int          size;          // size of table  
Object       currentEntry;  // currently selected table entry  

6.2 初始化(Initialization)
盡量在聲明局部變量的同時(shí)初始化。唯一不這么做的理由是變量的初始值依賴于某些先前發(fā)生的計(jì)算黔姜。

6.3 布局(Placement)
只在代碼塊的開始處聲明變量拢切。(一個(gè)塊是指任何被包含在大括號(hào)"{"和"}"中間的代碼。)不要在首次用到該變量時(shí)才聲明之秆吵。這會(huì)把注意力不集中的程序員搞糊涂淮椰,同時(shí)會(huì)妨礙代碼在該作用域內(nèi)的可移植性。

void myMethod() {  
    int int1 = 0;         // beginning of method block  
   
    if (condition) {  
        int int2 = 0;     // beginning of "if"block  
        ...  
    }  
}  

該規(guī)則的一個(gè)例外是for循環(huán)的索引變量

for (int i = 0; i < maxLoops; i++) { ... }  

避免聲明的局部變量覆蓋上一級(jí)聲明的變量纳寂。例如主穗,不要在內(nèi)部代碼塊中聲明相同的變量名:

int count;  
...  
myMethod() {  
    if (condition) {  
        int count= 0;     // AVOID!  
        ...  
    }  
    ...  
}  

6.4 類和接口的聲明(Class and Interface Declarations)
當(dāng)編寫類和接口時(shí),應(yīng)該遵守以下格式規(guī)則:

在方法名與其參數(shù)列表之前的左括號(hào)"("間不要有空格
左大括號(hào)"{"位于聲明語句同行的末尾
右大括號(hào)"}"另起一行毙芜,與相應(yīng)的聲明語句對齊忽媒,除非是一個(gè)空語句,"}"應(yīng)緊跟在"{"之后

class Sample extends Object {  
    int ivar1;  
    int ivar2;  
   
    Sample(int i, int j) {  
        ivar1 = i;  
        ivar2 = j;  
    }  
   
    int emptyMethod() {}  
   
    ...  
}  

方法與方法之間以空行分隔

7 語句(Statements)

7.1 簡單語句(Simple Statements)
每行至多包含一條語句腋粥,例如:

argv++;       // Correct  
argc--;       // Correct  
argv++; argc--;       // AVOID!  

7.2 復(fù)合語句(Compound Statements)
復(fù)合語句是包含在大括號(hào)中的語句序列猾浦,形如"{ 語句 }"。例如下面各段灯抛。

被括其中的語句應(yīng)該較之復(fù)合語句縮進(jìn)一個(gè)層次
左大括號(hào)"{"應(yīng)位于復(fù)合語句起始行的行尾;右大括號(hào)"}"應(yīng)另起一行并與復(fù)合語句首行對齊音瓷。
大括號(hào)可以被用于所有語句对嚼,包括單個(gè)語句,只要這些語句是諸如if-else或for控制結(jié)構(gòu)的一部分绳慎。這樣便于添加語句而無需擔(dān)心由于忘了加括號(hào)而引入bug纵竖。

7.3 返回語句(return Statements)
一個(gè)帶返回值的return語句不使用小括號(hào)"()",除非它們以某種方式使返回值更為顯見杏愤。例如:

return;  
   
return myDisk.size();  
   
return (size ? size : defaultSize);  

7.4 if靡砌,if-else,if else-if else語句(if, if-else, if else-if elseStatements)
if-else語句應(yīng)該具有如下格式:

if (condition) {  
    statements;  
}  
   
if (condition) {  
    statements;  
} else {  
    statements;  
}  
   
if (condition) {  
    statements;  
} else if (condition) {  
    statements;  
} else {  
    statements;  
}  

注意:if語句總是用"{"和"}"括起來珊楼,避免使用如下容易引起錯(cuò)誤的格式:

if (condition)//AVOID! THIS OMITS THE BRACES {}!  
    statement;  

7.5 for語句(for Statements)
一個(gè)for語句應(yīng)該具有如下格式:

for (initialization; condition; update) {  
    statements;  
}  

一個(gè)空的for語句(所有工作都在初始化通殃,條件判斷,更新子句中完成)應(yīng)該具有如下格式:

for (initialization; condition; update);  

當(dāng)在for語句的初始化或更新子句中使用逗號(hào)時(shí)厕宗,避免因使用三個(gè)以上變量画舌,而導(dǎo)致復(fù)雜度提高。若需要已慢,可以在for循環(huán)之前(為初始化子句)或for循環(huán)末尾(為更新子句)使用單獨(dú)的語句曲聂。

7.6 while語句(while Statements)
一個(gè)while語句應(yīng)該具有如下格式

while (condition) {  
    statements;  
}  

一個(gè)空的while語句應(yīng)該具有如下格式:

while (condition);  

7.7 do-while語句(do-while Statements)
一個(gè)do-while語句應(yīng)該具有如下格式:

do {  
    statements;  
} while (condition);  

7.8 switch語句(switch Statements)
一個(gè)switch語句應(yīng)該具有如下格式:

switch (condition) {  
case ABC:  
    statements;  
    /* falls through */  
case DEF:  
    statements;  
    break;  
   
case XYZ:  
    statements;  
    break;  
   
default:  
    statements;  
    break;  
}  

每當(dāng)一個(gè)case順著往下執(zhí)行時(shí)(因?yàn)闆]有break語句),通常應(yīng)在break語句的位置添加注釋佑惠。上面的示例代碼中就包含注釋/* falls through */朋腋。

7.9 try-catch語句(try-catch Statements)
一個(gè)try-catch語句應(yīng)該具有如下格式:

try {  
    statements;  
} catch (ExceptionClass e) {  
    statements;  
}  

一個(gè)try-catch語句后面也可能跟著一個(gè)finally語句齐疙,不論try代碼塊是否順利執(zhí)行完,它都會(huì)被執(zhí)行旭咽。

try {  
    statements;  
} catch (ExceptionClass e) {  
    statements;  
} finally {  
    statements;  
}  
8 空白(White Space)

8.1 空行(Blank Lines)
空行將邏輯相關(guān)的代碼段分隔開贞奋,以提高可讀性。
下列情況應(yīng)該總是使用兩個(gè)空行:

  • 一個(gè)源文件的兩個(gè)片段(section)之間
  • 類聲明和接口聲明之間

下列情況應(yīng)該總是使用一個(gè)空行:

  • 兩個(gè)方法之間
  • 方法內(nèi)的局部變量和方法的第一條語句之間
  • 塊注釋(參見"5.1.1)或單行注釋(參見"5.1.2)之前
  • 一個(gè)方法內(nèi)的兩個(gè)邏輯段之間轻专,用以提高可讀性

8.2 空格(Blank Spaces)
下列情況應(yīng)該使用空格:

一個(gè)緊跟著括號(hào)的關(guān)鍵字應(yīng)該被空格分開忆矛,例如:

while (true) {  
    ...  
}  

注意:空格不應(yīng)該置于方法名與其左括號(hào)之間。這將有助于區(qū)分關(guān)鍵字和方法調(diào)用请垛。
空白應(yīng)該位于參數(shù)列表中逗號(hào)的后面
所有的二元運(yùn)算符催训,除了".",應(yīng)該使用空格將之與操作數(shù)分開宗收。一元操作符和操作數(shù)之間不因該加空格漫拭,比如:負(fù)號(hào)("-")、自增("++")和自減("--")混稽。例如:

a += c + d;  
a = (a + b) / (c * d);  
  
while (d++ = s++) {  
    n++;  
}  
printSize("size is " + foo + "\n");  

for語句中的表達(dá)式應(yīng)該被空格分開采驻,例如:

for (expr1; expr2; expr3)  

強(qiáng)制轉(zhuǎn)型后應(yīng)該跟一個(gè)空格,例如:

myMethod((byte) aNum, (Object) x);  
myMethod((int) (cp + 5), ((int) (i + 3))  
                              + 1);  
9 命名規(guī)范(Naming Conventions)

命名規(guī)范使程序更易讀匈勋,從而更易于理解礼旅。它們也可以提供一些有關(guān)標(biāo)識(shí)符功能的信息,以助于理解代碼洽洁,例如痘系,不論它是一個(gè)常量,包饿自,還是類汰翠。
標(biāo)識(shí)符類型

** 命名規(guī)則 **

包(Packages)

一個(gè)唯一包名的前綴總是全部小寫的ASCII字母并且是一個(gè)頂級(jí)域名,通常是com昭雌,edu复唤,gov,mil烛卧,net佛纫,org,或1981年 ISO 3166標(biāo)準(zhǔn)所指定的標(biāo)識(shí)國家的英文雙字符代碼总放。包名的后續(xù)部分根據(jù)不同機(jī)構(gòu)各自內(nèi)部的命名規(guī)范而不盡相同雳旅。這類命名規(guī)范可能以特定目錄名的組成來區(qū)分部 門(department),項(xiàng)目(project)间聊,機(jī)器(machine)攒盈,或注冊名(login names)。

com.sun.engcom.apple.quicktime.v2edu.cmu.cs.bovik.cheese

類(Classes)

命名規(guī)則:類名是個(gè)一名詞哎榴,采用大小寫混合的方式型豁,每個(gè)單詞的首字母大寫僵蛛。盡量使你的類名簡潔而富于描述。使用完整單詞迎变,避免縮寫詞(除非該縮寫詞被更廣泛使用充尉,像URL,HTML)

class Raster;class ImageSprite;

接口(Interfaces)

命名規(guī)則:大小寫規(guī)則與類名相似

interface RasterDelegate;interface Storing;

方法(Methods)

方法名是一個(gè)動(dòng)詞衣形,采用大小寫混合的方式驼侠,第一個(gè)單詞的首字母小寫,其后單詞的首字母大寫谆吴。

run();runFast();getBackground();

變量(Variables)

除了變量名外倒源,所有實(shí)例,包括類句狼,類常量笋熬,均采用大小寫混合的方式,第一個(gè)單詞的首字母小寫腻菇,其后單詞的首字母大寫胳螟。變量名不應(yīng)以下劃線或美元符號(hào)開頭,盡管這在語法上是允許的筹吐。變量名應(yīng)簡短且富于描述糖耸。變量名的選用應(yīng)該易于記憶,即丘薛,能夠指出其用途蔬捷。盡量避免單個(gè)字符的變量名,除非是一次性的臨時(shí)變量榔袋。臨時(shí)變量通常被取名為i,j铡俐,k凰兑,m和n,它們一般用于整型审丘;c吏够,d,e滩报,它們一般用于字符型锅知。

char c;int i;float myWidth;

實(shí)例變量(Instance Variables)

大小寫規(guī)則和變量名相似,除了前面需要一個(gè)下劃線

int _employeeId;String _name;Customer _customer;

常量(Constants)

類常量和ANSI常量的聲明脓钾,應(yīng)該全部大寫售睹,單詞間用下劃線隔開。(盡量避免ANSI常量可训,容易引起錯(cuò)誤)

static final int MIN_WIDTH = 4;static final int MAX_WIDTH = 999;static final int GET_THE_CPU = 1;

10 編程實(shí)踐(Programming Practices)

10.1 提供對實(shí)例以及類變量的訪問控制(Providing Access to Instance and Class Variables)
若沒有足夠理由昌妹,不要把實(shí)例或類變量聲明為公有捶枢。通常,實(shí)例變量無需顯式的設(shè)置(set)和獲取(gotten)飞崖,通常這作為方法調(diào)用的邊緣效應(yīng) (side effect)而產(chǎn)生烂叔。
一個(gè)具有公有實(shí)例變量的恰當(dāng)例子,是類僅作為數(shù)據(jù)結(jié)構(gòu)固歪,沒有行為蒜鸡。亦即,若你要使用一個(gè)結(jié)構(gòu)(struct)而非一個(gè)類(如果java支持結(jié)構(gòu)的話)牢裳,那么把類的實(shí)例變量聲明為公有是合適的逢防。

10.2 引用類變量和類方法(Referring to Class Variables and Methods)
避免用一個(gè)對象訪問一個(gè)類的靜態(tài)變量和方法。應(yīng)該用類名替代贰健。例如:

classMethod();             //OK  
AClass.classMethod();      //OK  
anObject.classMethod();    //AVOID!  

10.3 常量(Constants)
位于for循環(huán)中作為計(jì)數(shù)器值的數(shù)字常量胞四,除了-1,0和1之外,不應(yīng)被直接寫入代碼伶椿。

10.4 變量賦值(Variable Assignments)
避免在一個(gè)語句中給多個(gè)變量賦相同的值辜伟。它很難讀懂。例如:

fooBar.fChar = barFoo.lchar = 'c'; // AVOID!  

不要將賦值運(yùn)算符用在容易與相等關(guān)系運(yùn)算符混淆的地方脊另。例如:

if (c++ = d++) {        // AVOID! (Java disallows)  
    ...  
}  

應(yīng)該寫成

if ((c++ = d++) != 0) {  
    ...  
}  

不要使用內(nèi)嵌(embedded)賦值運(yùn)算符試圖提高運(yùn)行時(shí)的效率导狡,這是編譯器的工作。例如:

d = (a = b + c) + r;        // AVOID!  

應(yīng)該寫成

a = b + c;  
d = a + r;  

10.5 其它實(shí)戰(zhàn)(Miscellaneous Practices)

10.5.1 圓括號(hào)(Parentheses)
一般而言偎痛,在含有多種運(yùn)算符的表達(dá)式中使用圓括號(hào)來避免運(yùn)算符優(yōu)先級(jí)問題旱捧,是個(gè)好方法医吊。即使運(yùn)算符的優(yōu)先級(jí)對你而言可能很清楚浦箱,但對其他人未必如此。你不能假設(shè)別的程序員和你一樣清楚運(yùn)算符的優(yōu)先級(jí)滑凉。

if (a == b && c == d)      // AVOID!  
if ((a == b) && (c == d))  // RIGHT  

10.5.2 返回值(Returning Values)
設(shè)法讓你的程序結(jié)構(gòu)符合目的谓谦。例如:

if (booleanExpression) {  
    return true;  
} else {  
    return false;  
}  

應(yīng)該代之以如下方法:

return booleanExpression;  

類似地:

if (condition) {  
    return x;  
}  
return y;  

應(yīng)該寫做:

return (condition ? x : y);  

10.5.3 條件運(yùn)算符"?"前的表達(dá)式(Expressions before '?' in the Conditional Operator)
如果一個(gè)包含二元運(yùn)算符的表達(dá)式出現(xiàn)在三元運(yùn)算符" ? : "的"?"之前贫橙,那么應(yīng)該給表達(dá)式添上一對圓括號(hào)。例如:

(x >= 0) ? x : -x;  

10.5.4 特殊注釋(Special Comments)
在注釋中使用XXX來標(biāo)識(shí)某些未實(shí)現(xiàn)(bogus)的但可以工作(works)的內(nèi)容反粥。用FIXME來標(biāo)識(shí)某些假的和錯(cuò)誤的內(nèi)容卢肃。

11 代碼示例(Code Examples)

11.1 Java源文件示例(Java Source File Example)
下面的例子,展示了如何合理布局一個(gè)包含單一公共類的Java源程序才顿。接口的布局與其相似莫湘。

/* 
 * @(#)Blah.java        1.82 99/03/18 
 * 
 * Copyright (c)1994-1999 Sun Microsystems, Inc. 
 * 901 San AntonioRoad, Palo Alto, California, 94303, U.S.A. 
 * All rightsreserved. 
 * 
 * This software isthe confidential and proprietary information of Sun 
 * Microsystems,Inc. ("Confidential Information"). You shall not 
 * disclose suchConfidential Information and shall use it only in 
 * accordance withthe terms of the license agreement you entered into 
 * with Sun. 
 */  
  
   
package java.blah;  
   
import java.blah.blahdy.BlahBlah;  
   
/** 
 * Classdescription goes here. 
 * 
 * @version    1.82 18 Mar 1999 
 * @author     Firstname Lastname 
 */  
public class Blah extends SomeClass {  
    /* A classimplementation comment can go here. */  
   
    /** classVar1documentation comment */  
    public static int classVar1;  
   
    /** 
     * classVar2documentation comment that happens to be 
     * more thanone line long 
     */  
    private static Object classVar2;  
   
    /**instanceVar1 documentation comment */  
    public Object instanceVar1;  
   
    /**instanceVar2 documentation comment */  
    protected int instanceVar2;  
   
    /**instanceVar3 documentation comment */  
    privateObject[] instanceVar3;  
   
    /** 
     *...constructor Blah documentation comment... 
     */  
    public Blah() {  
        //...implementation goes here...  
    }  
   
    /** 
     * ...methoddoSomething documentation comment... 
     */  
    public voiddoSomething() {  
        //...implementation goes here...  
    }  
   
    /** 
     * ...methoddoSomethingElse documentation comment... 
     * @paramsomeParam description 
     */  
    public voiddoSomethingElse(Object someParam) {  
        //...implementation goes here...  
    }  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市郑气,隨后出現(xiàn)的幾起案子幅垮,更是在濱河造成了極大的恐慌,老刑警劉巖尾组,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件军洼,死亡現(xiàn)場離奇詭異巩螃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)匕争,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門避乏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甘桑,你說我怎么就攤上這事拍皮。” “怎么了跑杭?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵铆帽,是天一觀的道長。 經(jīng)常有香客問我德谅,道長爹橱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任窄做,我火速辦了婚禮愧驱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椭盏。我一直安慰自己组砚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布掏颊。 她就那樣靜靜地躺著糟红,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乌叶。 梳的紋絲不亂的頭發(fā)上盆偿,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音准浴,去河邊找鬼事扭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兄裂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阳藻,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晰奖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腥泥?” 一聲冷哼從身側(cè)響起匾南,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛔外,沒想到半個(gè)月后蛆楞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溯乒,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年豹爹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裆悄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臂聋,死狀恐怖光稼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孩等,我是刑警寧澤艾君,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肄方,受9級(jí)特大地震影響冰垄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜权她,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一虹茶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伴奥,春花似錦写烤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尼啡,卻和暖如春暂衡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崖瞭。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工狂巢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人书聚。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓唧领,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雌续。 傳聞我的和親對象是個(gè)殘疾皇子斩个,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容