java程序書寫規范
命名規范
1、一般概念
1、盡量使用完整的英文描述符
2、采用適用於相關領域的術語
3、采用大小寫混合使名字可讀
4、盡量少用縮寫,但如果用了,必須符合整個工程中的統一定義
5、避免使用長的名字(小於 15 個字母為正常選擇)
6、避免使用類似的名字,或者僅僅是大小寫不同的名字
7、避免使用下劃線(除靜態常量等)
2、標識符類型說明
1、包( Package )的命名
Package 的名字應該采用完整的英文描述符,都是由一個小寫單詞組成。並且包名的前綴總是一個頂級域名,
通常是 com、edu、gov、mil、net、org 等;
如: com.yjhmily.test
2、類( Class )的命名
類名應該是個一名詞,采用大小寫混合的方式,每個單詞的首字母大寫。盡量保證類名簡潔而富於描述。
使用完整單詞,避免縮寫詞 ( 除非工程內有統一縮寫規范或該縮寫詞被更廣泛使用,像 URL , HTML)
如: FileDescription
3、接口( Interface )的命名
基本與 Class 的命名規范類似。在滿足 Classd 命名規則的基礎之上,保證開頭第一個字母為 ”I”,
便於與普通的 Class區別開。其實現類名稱取接口名的第二個字母到最後,且滿足類名的命名規范;
如: IMenuEngine
4、枚舉( Enum )的命名
基本與 Class 的命名規范類似。在滿足 Classd 命名規則的基礎之上,保證開頭第一個字母為 ”E” ,
便於與普通的 Class區別開。
如: EUserRole
5、異常( Exception )的命名
異常( Exception ) 通常采用字母 e 表示異常,對於自定義的異常類,其後綴必須為 Exception
如: BusinessException
6、方法( Method )的命名
方法名是一個動詞,采用大小寫混合的方式,第一個單詞的首字母小寫,其後單詞的首字母大寫。
方法名盡可能的描述出該方法的動作行為。返回類型為 Boolean 值的方法一般由“ is ”或“ has ”來開頭
如: getCurrentUser() 、 addUser() 、 hasAuthority()
7、參數( Param )的命名
第一個單詞的首字母小寫,其後單詞的首字母大寫。參數量名不允許以下劃線或美元符號開頭,
雖然這在語法上是允許的。參數名應簡短且富於描述。
如: public UserContext getLoginUser(String loginName);
8、常量字段 ( Constants )的命名
靜態常量字段( static final ) 全部采用大寫字母,單詞之間用下劃線分隔;
如: public static final Long FEEDBACK;
public static Long USER_STATUS;
1. 風格務必保持一貫性(Consistent)
一位同胞頂著我的鼻子問,為什麼我們的Java代碼縮進格式非得是這樣,而不能是他那樣,他就是喜歡他自己的這一種,因此他寫的代碼總是用他自己習慣的風格。結果在Code Review裡被大家斃掉,責令修改。因此他是大大地不服。就是風格一貫性問題。其實他的風格,本來也沒有什麼問題,但在項目裡,和其他程序員的程序的風格,顯得扃異,那就存在問題了。比如這個縮進,又比如變量命名方法,不同的類,不同的Methods裡,各自不同,這程序就很難看了。所以一旦你選擇了某種風格,一定要貫徹始終。如果一個項目裡規定了一個風格,即便很不符合你自己的習慣,也要貫徹始終,絕不應該有標新立異。
2. 縮進風格(indent)
既然是從縮進說起,就先說說縮進風格;一般來說,象Java這樣的類C語言,都采用縮進風格。而常用的,有四種
A.K&R風格
這是C程序最早的縮進風格,由C的發明者Ritchie和他的合作者Kernighan率先使用:
if (<cond>) {
<body>
}
其特點,是大括號和if判斷在同一行。通常,縮進為8個空格或一個tab鍵,但在C++和Java裡,也常縮進4個空格。有人喜歡用兩個空格,竊以為不好,不明顯。
B. BSD 風格
又稱Allman Style,源自Unix BSD程序員Eric Allman--他為BSD寫過很多程序:
if (<cond>)
{
<body>
}
特點:大括號和條件判斷分在兩行。
C. Whitesmith風格
這種風格源於Whitesmith C:
if (<cond>)
{
<body>
}
D. GNU風格
這種風格僅見於GNU EMACS的源程序中:
if (<cond>)
{
<body>
}
那麼在Java裡用哪種好呢?建議只采用A或B。SUN有一個Java Code Name Convention,建議的是A。
3. Tab還是空格(Tabs vs Space)
還是縮進問題。那麼一次縮進應該多大距離?是八個空格鍵,還是一個Tab鍵?
Java有一個特點,就是跨平台性。不過跨平台指的是它的Class可以在不同平台的虛擬機上運行。Java的源程序,有時候可不是跨平台的。什麼?源程序還能不跨平台?是的。有次一個程序員送來一些Code,在我的環境裡打開,程序難看得一塌糊塗,有該縮進的地方,沒有縮進,有的則縮進一大截,如同怪石一樣,嶙峋參差。這樣的代碼質量可不行!叫來程序員一問,答曰在他那裡漂亮得很啊,他還專門花時間去美化它們了呢?
原來他的縮進沒有注意一個風格,在有的地方用Tab鍵,有的地方打空格。在一些不同的平台上,Tab鍵的寬度可是不一樣的。
說道這裡,相信大家比較清楚了,在縮進的時候,盡量不用Tab,而是用空格。好在許多編輯器,都可以把你的鍵盤上的Tab鍵定義成幾個空格。趕緊去定義它!
每次用多少空格呢?4個。2個太少不明顯,8個太多占空間。
4. 行寬
說道8個空格鍵占空間,那麼我一行有320列,8個空格算什麼?打住!請寄住,一行盡量不要超過80列。許多終端一個屏幕只能顯示80列,為它們想想巴。如果你的語句太長,想辦法折斷它,分幾列來寫。
5. 變量命名
SUN Java Code Convention裡定義了Java裡package, class, method和普通變量的命名規則,我就不用再浪費字節了。這裡提提一些注意事項和一些SUN沒提到但大家常用的方式。
a. 用有意義的名字命名變量
首先,用完整的英語單詞或約定俗成的簡寫命名你的變量,如:
firstName
zipCode
如果英語不夠好,至少用別人看得懂的拼音命名,如
zhuZhi (住址)
胡亂簡寫,或者胡亂命名,則沒有人看得懂你的變量的含義:
fn
zc
zz
b. 常量用全大寫加下畫線命名
Java裡的常量,就是static final:
static final SMTH_BBS="bbs.tsinghua.edu.cn";
c. 用復數命名collection類變量
collection包括數組,vector等。命名時請用復數:
customers
classMates
也可以用一些修飾詞命名:
someStudents
allDepartments
d. 循環變量
一般大家都用i, j, k等做循環變量。
e. Stream變量
一般習慣用in, out作為Stream變量,對應inputStream, outputStream
類。如果即讀又寫的ioStream,可以用inOut。
f. 變量的命名習慣
習慣MFC的人喜歡采用匈牙利命名法(Hungarian Notation)。如果你習慣這樣,盡管用,但注意要和同Project的人保持一致。還有些人習慣C++裡的下畫線方式,也可以采用。
Hungarian Notation:
sFirstName
Under Score Style:
_firstName
這裡提供一個Hungarian Notation的前綴命名習慣:
int i
byte b
char c
double d
float f
long l
offset off
length len
Object o
String s (or str)
Arbitray value v
6. Java文件格式
有許多方式定義你的文件語句格式,以下是一個例子:
a. 文件頭說明 (可無)
b. Package定義
c. 空行
d. Import語句
e. 空行
f. 類定義
如:
package com.midi;
//Java Classes
import java.awt.*;
import java.io.*;
import javax.swing.event.*;
//WebLogic Classes
import weblogic.internal.*;
/**
* Blah blah
* @author midi
* @version 22.2
*/
public class MyFirst extends JFrame {
...
}
/**
* Foo...
* @author midi
* @version 38.2
*/
class Foo {
...
}
7. import順序
雜亂無章的順序,看起來很不順眼。應該對你要import的classes歸類,按順序羅列:
a. Java標准類(java.*)
b. Java擴充類(javax.*)
c. 第三方類
d. 你的應用程序的類
而且注意在第三方類裡注釋它們,說明它們的來源:
import java.*;
import java.util.Date;
import java.util.Enumeration;
import javax.sql.*;
//Apache Xerces
import org.apache.xml.*;
import org.apache.xerces.dom.*;
//Application classes
import com.midi.util.*;
8. Classes的順序
a. Javadoc注釋或者其它文件頭注釋
b. 類聲明
c. Fields聲明
d. 空行
e. 構造函數
f. 空行
g. 方法(不包括main)
h. 空行
i. Inner類
j. 空行
k. main()
例:
/**
* This is a simple DOM tree XML parser...
* ...
* @author: midi
* @version: 0.0.1
**/
public class MyParser {
// public constants
public static final String TITLE = "MyParser";
public static final String VERSION = "0.0.1";
// Private variables
private int iSchemaVersion;
/**
* Constructor
*/
public MyParser () {
iSchemaVersion = 1;
}
/**
* Constructor
* @param...
*/
public MyParser (iSchemaVersion) {
this.iSchemaVersion = iSchemaVersion;
}
/**
* Initialize the parser...
*/
public void myInit () throws Exception {
....
}
/**
* start the application
*/
public static void main (String[] argvs) {
...
}
}
9. Field定義
請遵從以下順序:
a. Public常量
b. Public變量
c. Protected常量
d. Protected變量
e. Package常量
f. Package變量
g. Private常量
h. Private變量
另:本文僅限IT愛好者交流
該文引自百度文庫,如有雷同,純屬巧合,本文最終解釋權歸此博主所有。