JAVA書寫規(guī)范
(這條文章已經(jīng)被閱讀了364次) 時(shí)間:2002年03月08日 18:59 來源:韓偉 原創(chuàng)-IT
1. 命名
1.1 Package的名字由一個(gè)小寫單詞組成;
一個(gè)特有的包的名字的第一部分總是全部使用小寫字母,
并應(yīng)該是頂級域名中的一個(gè),現(xiàn)在有com, edu, gov, mil, net, org,
或者是在ISO標(biāo)準(zhǔn)3166,1981中定義的兩個(gè)字母的國家標(biāo)識。
這樣的規(guī)則可確定某一目錄分開的組件,部門,項(xiàng)目,或登陸名
com.sun.eng , com.apple.quicktime.v2 ,org.apache.catalina
1.2 Class/Interface:大寫字母開頭而其他字母都小寫;
類的名字應(yīng)是名詞,混合大小寫,每個(gè)詞的第一個(gè)字母大寫。
盡量保證你的類的名字簡單并是描述性的。使用完整的單詞-避免
頭字語和縮寫(除非縮寫比長的格式更廣泛使用,例如URL or HTML)
class ImageSprite , interface RasterDelegate
1.3 方法應(yīng)是動詞,混合大小寫,第一個(gè)字母小寫,每個(gè)內(nèi)部的詞
的第一個(gè)字母大寫;除了變量,所有的實(shí)例、類和類的常量都
是以小寫字母開頭的混和大小寫。內(nèi)部的詞以大寫字母開頭。
變量名字不應(yīng)以下劃線或美元符$開始,盡管二者都是允許的。
run() ,runFast() , getBackground()
1.4 變量名字應(yīng)簡短但有意義。變量名字的選擇應(yīng)該是可記憶
的---就是說給普通的人指出它的使用的目的,除非是臨時(shí)的。臨時(shí)變
量的一般的名字對于整形變量是i,j,k,m,和n,對于字符是c,d,和e。
int i;
char c;
float myWidth;
1.5 常量:聲明類常量的變量和ANSI常量的名字為下劃線分開的
大寫字母單詞(應(yīng)避免ANSI常量,除非為了調(diào)試)
static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
2. 文件
2.1 開頭:注釋(name,version,date,copyright),package,import;
/*
* Classname
*
* Version information
*
* Date
*
* Copyright notice
*/
package java.awt;
import java.awt.peer.CanvasPeer;
2.2 Class/Interface:JavaDoc文檔注釋,體(包含程序、運(yùn)行和其他注釋);
變量,實(shí)例,方法等:按public,protect,private排列;盡量少用public。
參見最后example
3. 縮進(jìn)
3.1 避免每行多于80 個(gè)字符,逗號后或運(yùn)算符前斷開,
someMethod(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
3.2 較高級的斷開比較低級的斷開更好,新行應(yīng)與同級
上一行的開頭對齊;以下是斷開算術(shù)式的兩個(gè)例子。
第一個(gè)較好,因?yàn)閿嚅_出現(xiàn)在算術(shù)式以外,處于較高一級。
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; // PREFER
longName1 = longName2 * (longName3 + longName4
- longName5) + 4 * longname6; // AVOID
3.3 縮排的一個(gè)單位應(yīng)使用4 個(gè)空格,不使用制表符而盡量使用空格。
通常語句使用8個(gè)空格縮進(jìn),就要折行,由于傳統(tǒng)的(4個(gè)空格)
縮進(jìn)使觀察程序體比較難。例如:
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) { file://BAD WRAPS
doSomethingAboutIt(); file://MAKE THIS LINE EASY TO MISS
}
file://USE THIS INDENTATION INSTEAD
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
4. 注釋,Java程序有兩類注釋:文檔注釋和執(zhí)行注釋。
4.1 文檔注釋只有java具有,/**...*/。能夠被javadoc 工具生成HTML文檔,
描述類,接口,構(gòu)造器,方法和字段,相當(dāng)于使用指南。
/**
* Class description goes here.
*
* @version 1.82 18 Mar 1999
* @author Firstname Lastname
*/
4.2 執(zhí)行注釋是那些在使用在C++中的/*...*/和//。目的為了理解程序和運(yùn)行,
包括不適合于文檔注釋的內(nèi)容,塊狀或一行,使用/*...*/,注釋程序可使用//,
也可放在短行后面,盡量對齊。
/*
* @(#)Blah.java 1.82 99/03/18
*
* Copyright (c) 1994-1999 Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Sun.
*/
/* A class implementation comment can go here. */
// implementation comment
5. 聲明declaration
5.1 每行一個(gè)聲明,加以注釋;
int level; // indentation level
int size; // size of table
5.2 不要在同一行放置不同的類型;
int foo, fooarray[]; file://WRONG!
5.3 只在塊的開始處,放置聲明;
第一次使用時(shí)再聲明,增強(qiáng)代碼的可移植性。
if (condition) {
int int2 = 0; // beginning of "if" block
...
}
for (int i = 0; i < maxLoops; i++) { ... }
5.4 方法后緊跟"(" ,"{"出現(xiàn)在行尾。
Sample(int i, int j) {
ivar1 = i;
ivar2 = j;
}
6. 語句
6.1 每行最多包括一個(gè)語句;
argv++; // Correct
argc--; // Correct
argv++; argc--; // AVOID!
if (condition) {
statements;
} else {
statements;
}
for (initialization; condition; update) {
statements;
}
6.2 比較重要的一個(gè):
try {
statements;
}catch (ExceptionClass e) {
statements;
}
7. 空格
7.1 利用空行分隔代碼段來提高可讀性;
7.2 使用空行:類,接口,方法之間,在一個(gè)方法的本地變量和它的第一個(gè)語句間;
7.3 被一個(gè)圓括號跟著的關(guān)鍵字應(yīng)被一個(gè)空格所分開,
例"while (true) { ",
但方法不分開。
7.4 參數(shù)列表中的逗號之后使用一個(gè)空格。
public void doSomethingElse(Object someParam, String twoParam)
7.5 二進(jìn)制的操作符與數(shù)以空格分開,例"a = (a + b) / (c * d);" 。
8. 其它
8.1 避免使用一個(gè)對象來訪問一個(gè)類的(靜態(tài))變量或方法。
而是使用一個(gè)類的名字;
classMethod(); file://OK
AClass.classMethod(); file://OK
anObject.classMethod(); file://AVOID!
8.2 避免分配多個(gè)變量給同樣值在一個(gè)單獨(dú)的語句中;
fooBar.fChar = barFoo.lchar = 'c'; // AVOID!
8.3 適當(dāng)使用()和{}來分隔運(yùn)算和程序。
9. 性能有關(guān) (優(yōu)化代碼,調(diào)試,運(yùn)行)
避免太多的使用 synchronized 關(guān)鍵字 ;
盡量使用 StringBuffer 對象;
盡量不要混合使用AWT 和 Swing 組件,等等。
下面是一個(gè)參考范例。
/*
* @(#)Blah.java 1.82 99/03/18
*
* Copyright (c) 1994-1999 Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information of Sun
* with Sun.....
*/
package java.blah;
import java.blah.blahdy.BlahBlah;
/**
* Class description goes here.
*
* @version 1.82 18 Mar 1999
* @author Firstname Lastname
*/
public class Blah extends SomeClass {
/* 執(zhí)行注釋. */
/** classVar1 文檔注釋*/
public static int classVar1;
/**
* classVar2 多于一行的文檔注釋
* 注釋
*/
private static Object classVar2;
/** instanceVar1 文檔注釋 */
public Object instanceVar1;
/** instanceVar2 文檔注釋 */
protected int instanceVar2;
/** instanceVar3 文檔注釋 */
private Object[] instanceVar3;
/**
* ...構(gòu)造器 Blah 文檔注釋...
*/
public Blah() {
// ...執(zhí)行注釋 goes here...
}
/**
* ...方法 doSomething 文檔注釋...
*/
public void doSomething() {
// ...執(zhí)行注釋 goes here...
}
/**
* ...方法 doSomethingElse文檔注釋..
* @param someParam參數(shù)描述
*/
public void doSomethingElse(Object someParam) {
// ...執(zhí)行注釋goes here...
}
}