C/C++源代碼書寫規(guī)范1. 在.h/.cpp的開頭應(yīng)有一段格式統(tǒng)一的說明,內(nèi)容包括:a. 文件名 (FileName);b. 創(chuàng)建人 (Creator);c. 文件創(chuàng)建時(shí)間 (Date);d. 簡(jiǎn)短說明文件功能、用途 (Comment)。例:////////////////////////////////////////////// FileName: GetVersion.h// Creator: Liu Haifeng// Date: 2002-10-28// Comment: Get file version information////////////////////////////////////////////2.對(duì)于主要功能函數(shù)應(yīng)有注釋說明。內(nèi)容包括:功能、入口/出口參數(shù),必要時(shí)還可有備注或補(bǔ)充說明,對(duì)于函數(shù)中的主要功能代碼,也應(yīng)有注釋說明。注釋以英文為主。例://////////////////////////////////////////////Remarks:// Check file whether exist////Parameters:// LPCTSTR lpszPathName : Input full path name////Return values:// int : Non-zero means success// Zero means failure////////////////////////////////////////////3. 每列代碼的長(zhǎng)度推薦為80列,最長(zhǎng)不得超過120列;折行以對(duì)齊為準(zhǔn)。例:HANDLE KSOpenFile(const char cszFileName[],int nMode);或者:BOOL KSReadFile(HANDLE hFile,void *pvBuffer,int nReadSize,int *pnReadSize);4. 循環(huán)、分支代碼,判斷條件與執(zhí)行代碼不得在同一行上。例:正確:if (n == -2)n = 1;elsen = 2;不得寫做:if (n == -2) n = 1;else n = 2;5. 指針的定義,* 號(hào)既可以緊接類型,也可以在變量名之前。例:可寫做:int* pnsize;也可寫做:int *pnsize;但不得寫做:int * pnsize;6. 在類的成員函數(shù)內(nèi)調(diào)用非成員函數(shù)時(shí),在非成員函數(shù)名前必須加上"::"。例:::Sleep(2000);7. 函數(shù)入口參數(shù)有缺省值時(shí),應(yīng)注釋說明。例:BOOL KSSaveToFile(const char cszFileName[],BOOL bCanReplace /* = TRUE */);或者:BOOL KSSaveToFile(const char cszFileName[],BOOL bCanReplace // = TRUE);8. else if 必須寫在一行。9. 與‘{’、‘}’有關(guān)的各項(xiàng)規(guī)定:9.1‘{’、‘}’應(yīng)獨(dú)占一行。在該行內(nèi)可有注釋。例:正確:for (i = 0; i cbLine; i++){ // .....printf("Line %d:", i);printf("%s\n", pFileLines);}不得寫做:for (i = 0; i cb; i++){ printf("Line %d:", i);printf("%s\n", pFileLines);}9.2‘{’必須另起一行,‘{’之后的代碼必須縮進(jìn)一個(gè)Tab?!畕’與‘}’必須在同一列上。例:正確:if (i 0){m = 1;n++;}不得寫做:if (i 0) {m = 1;n++;}例外:if (i == 0){ ASSERT(FALSE); return; }9.3 在循環(huán)、分支之后若只有一行代碼,雖然可省略‘{’、‘}’,但不推薦這么做。若省略后可能引起歧義,則必須加上‘{’、‘}’。例:正確:if (n == -2)n = 1;elsen = 2;或者:if (n == -2){ n = 1; }else if (n != nTemp){ n = 2; }else{ n = 3; }不得寫做:if (n == -2)n = 1;else if (n != nTemp)n = 2;elsen = 3;不推薦:if (i 1){ n = 1; }else{if (i == 1){ n = 2; }else{if (i 1){ n = 3; }}}10. 與空格有關(guān)的各項(xiàng)規(guī)定。10.1 在所有兩目、三目運(yùn)算符的兩邊都必須有空格。在單目運(yùn)算符兩端不必空格。但在‘-’、‘::’、‘.’、‘[’、‘]’等運(yùn)算符前后,及‘’(取地址)、‘*’(取值)等運(yùn)算符之后不得有空格。例:正確:int n = 0, nTemp;for (int i = nMinLine; i = nMaxLine; i++)不得寫做:int n=0, nTemp;for ( int i=nMinLine; i=nMaxLine; i++ )10.2 for、while、if 等關(guān)鍵詞之后應(yīng)有1個(gè)空格,再接‘(’,之后無空格;在結(jié)尾的‘)’前不得有空格。例:正確:if (-2 == n)不得寫做:if(-2 == n)或if ( -2 == n )等等。10.3 調(diào)用函數(shù)、宏時(shí),‘(’、‘)’前后不得有空格。例:正確:printf("%d\n", nIndex);不得寫做:printf ("%d\n", nIndex);printf( "%d\n", nIndex );等等。10.4 類型強(qiáng)制轉(zhuǎn)換時(shí),‘(’‘)’前后不得有空格例:可寫做:(KSFile*)pFile;也可寫做:(KSFile *)pFile不得寫做:( KSFile* )pFile( KSFile * ) pFile11. 與縮進(jìn)有關(guān)的各項(xiàng)規(guī)定11.1 縮進(jìn)以 Tab 為單位。1 個(gè) Tab 為 4 個(gè)空格11.2 下列情況,代碼縮進(jìn)一個(gè) Tab:1. 函數(shù)體相對(duì)函數(shù)名及'{'、'}'。例:int Power(int x){return (x * x);}2. if、else、for、while、do 等之后的代碼。3. 一行之內(nèi)寫不下,折行之后的代碼,應(yīng)在合理的位置進(jìn)行折行。若有 + - * / 等運(yùn)算符,則運(yùn)算符應(yīng)在上一行末尾,而不應(yīng)在下一行的行首。11.3 下列情況,不必縮進(jìn):switch 之后的 case、default。例:switch (nID){case ID_PLAY:......break;case ID_STOP:......break;default:......break;12.對(duì)于涉及到系統(tǒng)的功能調(diào)用,要求使用系統(tǒng)提供的宏,不得直接使用具體的數(shù)值。例: char szSystemPath[MAX_PATH] = {0}; 正確char szSystemPath[260] = {0}; 錯(cuò)誤13.關(guān)于函數(shù)編寫的規(guī)定13.1 除了非常簡(jiǎn)單的函數(shù)或者沒有必要,函數(shù)需要有返回值,并且推薦返回值的類型為int,成功時(shí)為 true,失敗時(shí)為false。不推薦直接使用1和0來表示。13.2 在函數(shù)內(nèi)部變量定義全部放在函數(shù)的開始處,不能在代碼中間出現(xiàn) 變量定義。變量定義需要初始化值,一般是0、false、NULL等。13.3 程序員自行編寫的函數(shù)不推薦使用DWORD等指明字節(jié)長(zhǎng)度的變量 類型,推薦使用unsigned long等變量類型。對(duì)于ULONG等vc系統(tǒng)定義的變量類型,推薦使用unsigned long 來代替。如果調(diào)用系統(tǒng)API,在MSDN中已經(jīng)指明了是DWORD等類型,則可以使用。13.4 推薦使用int nResult作為函數(shù)自身的返回值變量,int nRetCode、BOOL bRetCode作為調(diào)用其他函數(shù)的返回值變量。13.5 推薦使用goto語句來統(tǒng)一函數(shù)出口,goto語句一般只能跳轉(zhuǎn)到一個(gè)函數(shù)出口,最多只能有兩個(gè),出口標(biāo)識(shí)必須命名為Exit0和Exit1。在出口處必須顯式檢查曾經(jīng)申請(qǐng)過的系統(tǒng)資源(如內(nèi)存),并且進(jìn)行釋放。13.6 如果編寫DLL,除非特殊情況,導(dǎo)出函數(shù)的調(diào)用類型必須是__stdcall,便于多模塊協(xié)同工作。附錄:1.函數(shù)編寫示范///////////////////////////////////////////////////////////////////////// Remarks:// Get file version information//// Parameters:// [in] const char cszPathName : Input file path name// [out] PVERSION_INFO *pVersionInfo : File version information//// Return values:// int : Non-zero means success, zero means failure///////////////////////////////////////////////////////////////////////int GetFileVersion(const char cszPathName, PVERSION_INFO *pVersionInfo){int nResult = false;int nRetCode = false;char szSystemPath[MAX_PATH] = {0};nRetCode = IsFileExist(cszPathname);if (!nRetCode)goto Exit0;//Others code herenResult = true;Exit0:return nResult;}以前你的習(xí)慣可能是我定義一個(gè)函數(shù),通過傳遞參數(shù)去實(shí)現(xiàn)這個(gè)函數(shù)的功能。面向?qū)ο缶幊桃w現(xiàn)三個(gè)特點(diǎn)“封裝、繼承、多態(tài)”;比如你寫一個(gè)飛這個(gè)函數(shù),你需要在這里傳遞參數(shù)飛機(jī)。換個(gè)角度,你定義一個(gè)類是飛機(jī),那這個(gè)飛機(jī)在封裝的過程就有飛。降落等這功能(函數(shù))。你想要用飛這個(gè)功能(函數(shù))的時(shí)候,你只需調(diào)用飛機(jī)這個(gè)類“飛”這個(gè)成員函數(shù)。
創(chuàng)新互聯(lián)長(zhǎng)期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為德保企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),德保網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
1、組織與風(fēng)格
(1).關(guān)鍵詞和操作符之間加適當(dāng)?shù)目崭瘛?/p>
(2).相對(duì)獨(dú)立的程序塊與塊之間加空行
(3).較長(zhǎng)的語句、表達(dá)式等要分成多行書寫。
(4).劃分出的新行要進(jìn)行適應(yīng)的縮進(jìn),使排版整齊,語句可讀。
(5).長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首。
(6).循環(huán)、判斷等語句中若有較長(zhǎng)的表達(dá)式或語句,則要進(jìn)行適應(yīng)的劃分。
(7).若函數(shù)或過程中的參數(shù)較長(zhǎng),則要進(jìn)行適當(dāng)?shù)膭澐帧?/p>
(8).不允許把多個(gè)短語句寫在一行中,即一行只寫一條語句。
(9).函數(shù)或過程的開始、結(jié)構(gòu)的定義及循環(huán)、判斷等語句中的代碼都要采用縮進(jìn)風(fēng)格。
注:如果大家有興趣可以到安安DIY創(chuàng)作室博客,有相關(guān)說明性的文章和解釋。
2、注解
Java 的語法與 C++ 及為相似,那么,你知道 Java 的注釋有幾種嗎?是兩種?
// 注釋一行
/* ...... */ 注釋若干行
不完全對(duì),除了以上兩種之外,還有第三種,文檔注釋:
/** ...... */ 注釋若干行,并寫入 javadoc 文檔
注釋要簡(jiǎn)單明了。
String userName = null; //用戶名
邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注釋與代碼的一致性。
在必要的地方注釋,注釋量要適中。注釋的內(nèi)容要清楚、明了,含義準(zhǔn)確,防止注釋二義性。
保持注釋與其描述的代碼相鄰,即注釋的就近原則。
對(duì)代碼的注釋應(yīng)放在其上方相鄰位置,不可放在下面。對(duì)數(shù)據(jù)結(jié)構(gòu)的注釋應(yīng)放在其上方相鄰位置,不可放在下面;對(duì)結(jié)構(gòu)中的每個(gè)域的注釋應(yīng)放在此域的右方;
同一結(jié)構(gòu)中不同域的注釋要對(duì)齊。
變量、常量的注釋應(yīng)放在其上方相鄰位置或右方。
全局變量要有較詳細(xì)的注釋,包括對(duì)其功能、取值范圍、哪些函數(shù)或過程存取它以及存取時(shí)注意事項(xiàng)等的說明。
在每個(gè)源文件的頭部要有必要的注釋信息,包括:文件名;版本號(hào);作者;生成日期;模塊功能描述(如功能、主要算法、內(nèi)部各部分之間的關(guān)系、該文件與其它文件關(guān)系等);主要函數(shù)或過程清單及本文件歷史修改記錄等。
/**
* Copy Right Information : Neusoft IIT
* Project : eTrain
* JDK version used : jdk1.3.1
* Comments : config path
* Version : 1.01
* Modification history :2003.5.1
* Sr Date Modified By Why What is modified
* 1. 2003.5.2 Kevin Gao new
**/
在每個(gè)函數(shù)或過程的前面要有必要的注釋信息,包括:函數(shù)或過程名稱;功能描述;輸入、輸出及返回值說明;調(diào)用關(guān)系及被調(diào)用關(guān)系說明等
/**
* Description :checkout 提款
* @param Hashtable cart info
* @param OrderBean order info
* @return String
*/
public String checkout(Hashtable htCart,
OrderBean orderBean)
throws Exception{
}
javadoc注釋標(biāo)簽語法
@author 對(duì)類的說明 標(biāo)明開發(fā)該類模塊的作者
@version 對(duì)類的說明 標(biāo)明該類模塊的版本
@see 對(duì)類、屬性、方法的說明 參考轉(zhuǎn)向,也就是相關(guān)主題
@param 對(duì)方法的說明 對(duì)方法中某參數(shù)的說明
@return 對(duì)方法的說明 對(duì)方法返回值的說明
@exception 對(duì)方法的說明 對(duì)方法可能拋出的異常進(jìn)行說明
3、命名規(guī)范
定義這個(gè)規(guī)范的目的是讓項(xiàng)目中所有的文檔都看起來像一個(gè)人寫的,增加可讀性,減少項(xiàng)目組中因?yàn)閾Q人而帶來的損失。(這些規(guī)范并不是一定要絕對(duì)遵守,但是一定要讓程序有良好的可讀性)較短的單詞可通過去掉元音形成縮寫;要不然最后自己寫的代碼自己都看不懂了,那可不行。
較長(zhǎng)的單詞可取單詞的頭幾發(fā)符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí)。
使用匈牙利表示法
Package 的命名
Package 的名字應(yīng)該都是由一個(gè)小寫單詞組成。
package com.neu.util
Class 的命名
Class 的名字必須由大寫字母開頭而其他字母都小寫的單詞組成,對(duì)于所有標(biāo)識(shí)符,其中包含的所有單詞都應(yīng)緊靠在一起,而且大寫中間單詞的首字母。
public class ThisAClassName{}
Class 變量的命名
變量的名字必須用一個(gè)小寫字母開頭。后面的單詞用大寫字母開頭
userName , thisAClassMethod
Static Final 變量的命名
static Final 變量的名字應(yīng)該都大寫,并且指出完整含義。
/**
*DBConfig PATH
**/
public static final String
DB_CONFIG_FILE_PATH =com.neu.etrain.dbconfig;
參數(shù)的命名
參數(shù)的名字必須和變量的命名規(guī)范一致。
數(shù)組的命名
數(shù)組應(yīng)該總是用下面的方式來命名:
byte[] buffer;
而不是:
byte buffer[];
方法的參數(shù)
使用有意義的參數(shù)命名,如果可能的話,使用和要賦值的字段一樣的名字:
SetCounter(int size){
this.size = size;
}
4、文件樣式
所有的 Java(*.java) 文件都必須遵守如下的樣式規(guī)則:
版權(quán)信息
版權(quán)信息必須在 java 文件的開頭,比如:
/*
* Copyright ? 2000 Shanghai XXX Co. Ltd.
* All right reserved.
*/
其他不需要出現(xiàn)在 javadoc 的信息也可以包含在這里。
Package/Imports
package 行要在 import 行之前,import 中標(biāo)準(zhǔn)的包名要在本地的包名之前,而且按照字母
順序排列。如果 import 行中包含了同一個(gè)包中的不同子目錄,則應(yīng)該用 * 來處理。
package hotlava.net.stats;
import java io.*;
import java.util.Observable;
import hotlava.util.Application;
這里 java。io.* 使用來代替InputStream and OutputStream 的。
Class
接下來的是類的注釋,一般是用來解釋類的。
/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下來是類定義,包含了在不同的行的 extends 和 implements
public class CounterSet
extends Observable
implements Cloneable
Class Fields
接下來是類的成員變量:
/**
* Packet counters
*/
protected int[] packets;
public 的成員變量必須生成文檔(JavaDoc)。proceted、private和 package 定義的成
員變量如果名字含義明確的話,可以沒有注釋。
存取方法
接下來是類變量的存取的方法。它只是簡(jiǎn)單的用來將類的變量賦值獲取值的話,可以簡(jiǎn)單的
寫在一行上。
/**
* Get the counters
* @return an array containing the statistical data. This array has been
* freshly allocated and can be modified by the caller.
*/
public int[] getPackets() { return copyArray(packets, offset); }
public int[] getBytes() { return copyArray(bytes, offset); }
public int[] getPackets() { return packets; }
public void setPackets(int[] packets) { this.packets = packets; }
其它的方法不要寫在一行上
構(gòu)造函數(shù)
接下來是構(gòu)造函數(shù),它應(yīng)該用遞增的方式寫(比如:參數(shù)多的寫在后面)。
訪問類型 (public, private 等.) 和 任何 static, final 或 synchronized 應(yīng)該在一行
中,并且方法和參數(shù)另寫一行,這樣可以使方法和參數(shù)更易讀。
public
CounterSet(int size){
this.size = size;
}
克隆方法
如果這個(gè)類是可以被克隆的,那么下一步就是 clone 方法:
public
Object clone() {
try {
CounterSet obj = (CounterSet)super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}catch(CloneNotSupportedException e) {
throw new InternalError(Unexpected CloneNotSUpportedException: +
e.getMessage());
}
}
類方法
下面開始寫類的方法:
/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final
void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws IllegalArgumentException
{
//
// Ensure the arrays are of equal size
//
if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
throw new IllegalArgumentException(Arrays must be of the same size);
System.arraycopy(r1, 0, r3, 0, r1.length);
System.arraycopy(r2, 0, r4, 0, r1.length);
}
toString 方法
無論如何,每一個(gè)類都應(yīng)該定義 toString 方法:
public
String toString() {
String retval = CounterSet: ;
for (int i = 0; i data.length(); i++) {
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
}
main 方法
如果main(String[]) 方法已經(jīng)定義了, 那么它應(yīng)該寫在類的底部.
5、代碼可讀性
避免使用不易理解的數(shù)字,用有意義的標(biāo)識(shí)來替代。
不要使用難懂的技巧性很高的語句。
源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。
6、代碼性能
在寫代碼的時(shí)候,從頭至尾都應(yīng)該考慮性能問題。這不是說時(shí)間都應(yīng)該浪費(fèi)在優(yōu)化代碼上,而是我們時(shí)刻應(yīng)該提醒自己要注意代碼的效率。比如:如果沒有時(shí)間來實(shí)現(xiàn)一個(gè)高效的算法,那么我們應(yīng)該在文檔中記錄下來,以便在以后有空的時(shí)候再來實(shí)現(xiàn)她。
不是所有的人都同意在寫代碼的時(shí)候應(yīng)該優(yōu)化性能這個(gè)觀點(diǎn)的,他們認(rèn)為性能優(yōu)化的問題應(yīng)該在項(xiàng)目的后期再去考慮,也就是在程序的輪廓已經(jīng)實(shí)現(xiàn)了以后。
不必要的對(duì)象構(gòu)造
不要在循環(huán)中構(gòu)造和釋放對(duì)象
使用 StringBuffer 對(duì)象
在處理 String 的時(shí)候要盡量使用 StringBuffer 類,StringBuffer 類是構(gòu)成 String 類的基礎(chǔ)。
String 類將 StringBuffer 類封裝了起來,(以花費(fèi)更多時(shí)間為代價(jià))為開發(fā)人員提供了一個(gè)安全的接口。當(dāng)我們?cè)跇?gòu)造字符串的時(shí)候,我們應(yīng)該用 StringBuffer 來實(shí)現(xiàn)大部分的工作,當(dāng)工作完成后將 StringBuffer 對(duì)象再轉(zhuǎn)換為需要的 String 對(duì)象。比如:如果有一個(gè)字符串必須不斷地在其后添加許多字符來完成構(gòu)造,那么我們應(yīng)該使用StringBuffer 對(duì)象和她的 append() 方法。如果我們用 String 對(duì)象代替StringBuffer 對(duì)象的話,會(huì)花費(fèi)許多不必要的創(chuàng)建和釋放對(duì)象的 CPU 時(shí)間。大家可以來安安DIY創(chuàng)作室一起討論。
避免太多的使用 synchronized 關(guān)鍵字避免不必要的使用關(guān)鍵字 synchronized,應(yīng)該在必要的時(shí)候再使用她,這是一個(gè)避免死鎖的好方法。
7、編程技巧
byte 數(shù)組轉(zhuǎn)換到 characters
為了將 byte 數(shù)組轉(zhuǎn)換到 characters,你可以這么做:
Hello world!.getBytes();
Utility 類
Utility 類(僅僅提供方法的類)應(yīng)該被申明為抽象的來防止被繼承或被初始化。
初始化
下面的代碼是一種很好的初始化數(shù)組的方法:
objectArguments = new Object[] { arguments };
枚舉類型
JAVA 對(duì)枚舉的支持不好,但是下面的代碼是一種很有用的模板:
class Colour {
public static final Colour BLACK = new Colour(0, 0, 0);
public static final Colour RED = new Colour(0xFF, 0, 0);
public static final Colour GREEN = new Colour(0, 0xFF, 0);
public static final Colour BLUE = new Colour(0, 0, 0xFF);
public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);
}
這種技術(shù)實(shí)現(xiàn)了RED, GREEN, BLUE 等可以象其他語言的枚舉類型一樣使用的常量。
他們可以用 '==' 操作符來比較。
但是這樣使用有一個(gè)缺陷:如果一個(gè)用戶用這樣的方法來創(chuàng)建顏色 BLACK new Colour(0,0,0)
那么這就是另外一個(gè)對(duì)象,'=='操作符就會(huì)產(chǎn)生錯(cuò)誤。她的 equal() 方法仍然有效。由于這個(gè)原因,這個(gè)技術(shù)的缺陷最好注明在文檔中,或者只在自己的包中使用。
8、編寫格式
代碼樣式
代碼應(yīng)該用 unix 的格式,而不是 windows 的(比如:回車變成回車+換行)
文檔化
必須用 javadoc 來為類生成文檔。不僅因?yàn)樗菢?biāo)準(zhǔn),這也是被各種 java 編譯器都認(rèn)可的方法。使用 @author 標(biāo)記是不被推薦的,因?yàn)榇a不應(yīng)該是被個(gè)人擁有的。
縮進(jìn)
縮進(jìn)應(yīng)該是每行2個(gè)空格. 不要在源文件中保存Tab字符. 在使用不同的源代碼管理工具時(shí)Tab字符將因?yàn)橛脩粼O(shè)置的不同而擴(kuò)展為不同的寬度.如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字符, 方法是通過 UltrEdit中先設(shè)定 Tab 使用的長(zhǎng)度室2個(gè)空格,然后用 Format|Tabs to Spaces 菜單將 Tab 轉(zhuǎn)換為空格。
頁寬
頁寬應(yīng)該設(shè)置為80字符. 源代碼一般不會(huì)超過這個(gè)寬度, 并導(dǎo)致無法完整顯示, 但這一設(shè)置也可以靈活調(diào)整. 在任何情況下, 超長(zhǎng)的語句應(yīng)該在一個(gè)逗號(hào)或者一個(gè)操作符后折行. 一條語句折行后, 應(yīng)該比原來的語句再縮進(jìn)2個(gè)字符.
{} 對(duì)
{} 中的語句應(yīng)該單獨(dú)作為一行. 例如, 下面的第1行是錯(cuò)誤的, 第2行是正確的:
if (i0) { i ++ }; // 錯(cuò)誤, { 和 } 在同一行
if (i0) {
i ++
}; // 正確, { 單獨(dú)作為一行
} 語句永遠(yuǎn)單獨(dú)作為一行.如果 } 語句應(yīng)該縮進(jìn)到與其相對(duì)應(yīng)的 { 那一行相對(duì)齊的位置。
括號(hào)
左括號(hào)和后一個(gè)字符之間不應(yīng)該出現(xiàn)空格, 同樣, 右括號(hào)和前一個(gè)字符之間也不應(yīng)該出現(xiàn)空格. 下面的例子說明括號(hào)和空格的錯(cuò)誤及正確使用:
CallProc( AParameter ); // 錯(cuò)誤
CallProc(AParameter); // 正確
不要在語句中使用無意義的括號(hào). 括號(hào)只應(yīng)該為達(dá)到某種目的而出現(xiàn)在源代碼中。下面的例子說明錯(cuò)誤和正確的用法:
if ((I) = 42) { // 錯(cuò)誤 - 括號(hào)毫無意義
if (I == 42) or (J == 42) then // 正確 - 的確需要括號(hào)
9、代碼編譯
1.編寫代碼時(shí)要注意隨時(shí)保存,并定期備份,防止由于斷電、硬盤損壞等原因造成代碼丟失。
2.同一項(xiàng)目組內(nèi),最好使用相同的編輯器,并使用相同的設(shè)置選項(xiàng)。
3.合理地設(shè)計(jì)軟件系統(tǒng)目錄,方便開發(fā)人員使用。
4.打開編譯器的所有告警開關(guān)對(duì)程序進(jìn)行編譯。
5.在同一項(xiàng)目組或產(chǎn)品組中,要統(tǒng)一編譯開關(guān)選項(xiàng)。
6.使用工具軟件(如Visual SourceSafe)對(duì)代碼版本進(jìn)行維護(hù)。如果大家有不明白的可以到安安DIY創(chuàng)作室留言。
10、可移植性
Borland Jbulider 不喜歡 synchronized 這個(gè)關(guān)鍵字,如果你的斷點(diǎn)設(shè)在這些關(guān)鍵字的作用域內(nèi)的話,調(diào)試的時(shí)候你會(huì)發(fā)現(xiàn)的斷點(diǎn)會(huì)到處亂跳,讓你不知所措。除非必須,盡量不要使用。
換行
如果需要換行的話,盡量用 println 來代替在字符串中使用\n。
你不要這樣:
System.out.print(Hello,world!\n);
要這樣:
System.out.println(Hello,world!);
或者你構(gòu)造一個(gè)帶換行符的字符串,至少要象這樣:
String newline = System.getProperty(line.separator);
System.out.println(Hello world + newline);
PrintStream
PrintStream 已經(jīng)被不贊成(deprecated)使用,用 PrintWrite 來代替它。
Java編碼規(guī)范: 盡量使用完整的英文描述符采用適用于相關(guān)領(lǐng)域的術(shù)語采用大小寫混合使名字可讀盡量少用縮寫,但如果用了,必須符合整個(gè)工程中的統(tǒng)一定義避免使用長(zhǎng)的名字(小于15個(gè)字母為正常選擇)避免使用類似的名字,或者僅僅是大小寫不同的名字避免使用下劃線(除靜態(tài)常量等)標(biāo)識(shí)符類型說明包(Package)的命名Package的名字應(yīng)該采用完整的英文描述符,都是由一個(gè)小寫單詞組成。并且包名的前綴總是一個(gè)頂級(jí)域名
,通常是com、edu、gov、mil、net、org等;如:com.yjhmily.test類(Class)的命名類名應(yīng)該是個(gè)一名詞,采用大小寫混合的方式,每個(gè)單詞的首字母大寫。盡量保證類名簡(jiǎn)潔而富于描述。
在進(jìn)行Java代碼敲寫的時(shí)候,我們知道是有很多的Java代碼規(guī)范是需要遵守的,但是有的Java學(xué)員就老是忘記,還有的Java學(xué)員是不屑遵守的,內(nèi)心想著是只要我的Java代碼OK,遵不遵守Java代碼規(guī)范,有什么問題呢?其實(shí)是存在問題的,為什么要遵守Java代碼規(guī)范?
為什么要遵守Java代碼規(guī)范?當(dāng)你第一次接觸到Java代碼規(guī)范的時(shí)候,你是不是覺得很麻煩呢?比如關(guān)于統(tǒng)一的原則,一再的強(qiáng)調(diào),但是你一再的忘記,或者壓根就不想照做,會(huì)出現(xiàn)什么樣的后果呢?今天云南java培訓(xùn)將借Java代碼規(guī)范中的統(tǒng)一來說說,自己對(duì)為什么要遵守Java代碼規(guī)范,發(fā)表自己簡(jiǎn)單的看法。
Java代碼規(guī)范中的統(tǒng)一是指,對(duì)于同一個(gè)概念,在程序中用同一種表示方法,比如對(duì)于供應(yīng)商,既可以用supplier,也可以用provider,但是我們只能選定一個(gè)使用,至少在一個(gè)Java項(xiàng)目中保持統(tǒng)一。統(tǒng)一是作為重要的,如果對(duì)同一概念有不同的表示方法,會(huì)使代碼混亂難以理解。即使不能取得好的名稱,但是只要統(tǒng)一,閱讀起來也不會(huì)太困難,因?yàn)殚喿x者只要理解一次。
而如果你在一個(gè)項(xiàng)目中不遵守已經(jīng)制定好的統(tǒng)一規(guī)范,那么不僅是給自己帶來麻煩,也是給其他工作人員帶來不便,在要進(jìn)行整理的時(shí)候,你的不同,會(huì)帶來不必要的交流麻煩。作為一個(gè)Java程序員,你一般是屬于團(tuán)隊(duì)中的一員,你不遵守制定好的Java代碼規(guī)范,其他人也不遵守那么你們的團(tuán)隊(duì)就得亂套了,所以面對(duì)Java代碼規(guī)范的學(xué)習(xí),不要覺得無趣,還是得用心記住,并且予以遵守。
Java也提供了一個(gè)byte數(shù)據(jù)類型,并且是基本類型。java byte是做為最小的數(shù)字來處理的,因此它的值域被定義為-128~127,也就是signed byte。
byte,即字節(jié),由8位的二進(jìn)制組成。在Java中,byte類型的數(shù)據(jù)是8位帶符號(hào)的二進(jìn)制數(shù)。
在計(jì)算機(jī)中,8位帶符號(hào)二進(jìn)制數(shù)的取值范圍是[-128, 127],所以在Java中,byte類型的取值范圍也是[-128, 127]。
運(yùn)算規(guī)則:
####正數(shù)的最高位都是 0 ,正數(shù)的值就是二進(jìn)制表示的值。 ####
####負(fù)數(shù)的最高位都是 1 ,負(fù)數(shù)的值是 取反后加一 然后加個(gè)負(fù)號(hào)得到得值。 ####
用8位的二進(jìn)制來說明此規(guī)則:
比如:00000001。最高位是0 為正數(shù) ,那么表示的就是 十進(jìn)制的 1。
再比如:10000001.最高位是1 為負(fù)數(shù),值是多少?取反得到 01111110 加1 得到 01111111 ,那么值為 -127
理解此運(yùn)算規(guī)則我們正式開始說byte,byte正好是8位的二進(jìn)制數(shù)。short是16位 int是32位 long是64位。
上述代碼,最后會(huì)輸出-56。原因如下:
200的二進(jìn)制表示是111001000,由于int是32位的二進(jìn)制,所以在計(jì)算機(jī)中,實(shí)際上是00000000000??111001000,當(dāng)int轉(zhuǎn)成byte的時(shí)候,那么計(jì)算機(jī)會(huì)只保留最后8位,即11001000。
然后11001000的最高位是1,那么表示是一個(gè)負(fù)數(shù),而負(fù)數(shù)在計(jì)算機(jī)中都是以補(bǔ)碼的形式保存的,所以我們計(jì)算11001000的原碼為00111000,即56,所以11001000表示的是-56,所以最后test的值為-56。
擴(kuò)展資料
Java編譯程序生成字節(jié)碼(byte-code),而不是通常的機(jī)器碼。Java字節(jié)碼提供對(duì)體系結(jié)構(gòu)中性的目標(biāo)文件格式,代碼設(shè)計(jì)成可有效地傳送程序到多個(gè)平臺(tái)。Java程序可以在任何實(shí)現(xiàn)了Java解釋程序和運(yùn)行系統(tǒng)(run-time system)的系統(tǒng)上運(yùn)行。
在一個(gè)解釋性的環(huán)境中,程序開發(fā)的標(biāo)準(zhǔn)“鏈接”階段大大消失了。如果說Java還有一個(gè)鏈接階段,它只是把新類裝進(jìn)環(huán)境的過程,它是增量式的、輕量級(jí)的過程。
因此,Java支持快速原型和容易試驗(yàn),它將導(dǎo)致快速程序開發(fā)。這是一個(gè)與傳統(tǒng)的、耗時(shí)的“編譯、鏈接和測(cè)試”形成鮮明對(duì)比的精巧的開發(fā)過程。
參考資料來源:百度百科—Java(計(jì)算機(jī)編程語言)
名稱 Java語言編碼規(guī)范(Java Code Conventions)
簡(jiǎn)介 本文檔講述了Java語言的編碼規(guī)范,較之陳世忠先生《c++編碼規(guī)范》的浩繁詳盡,此文當(dāng)屬短小精悍了。而其中所列之各項(xiàng)條款,從編碼風(fēng)格,到注意事項(xiàng),不單只Java,對(duì)于其他語言,也都很有借鑒意義。因?yàn)楹?jiǎn)短,所以易記,大家不妨將此作為handbook,常備案頭,逐一對(duì)驗(yàn)。
1 介紹
1.1 為什么要有編碼規(guī)范
1.2 版權(quán)聲明
2 文件名
2.1 文件后綴
2.2 常用文件名
3 文件組織
3.1 Java源文件
3.1.1 開頭注釋
3.1.2 包和引入語句
3.1.3 類和接口聲明
4 縮進(jìn)排版
4.1 行長(zhǎng)度
4.2 換行
5 注釋
5.1 實(shí)現(xiàn)注釋的格式
5.1.1 塊注釋
5.1.2 單行注釋
5.1.3 尾端注釋
5.1.4 行末注釋
5.2 文擋注釋
6 聲明
6.1 每行聲明變量的數(shù)量
6.2 初始化
6.3 布局
6.4 類和接口的聲明
7 語句
7.1 簡(jiǎn)單語句
7.2 復(fù)合語句
7.3 返回語句
7.4 if,if-else,if else-if else語句
7.5 for語句
7.6 while語句
7.7 do-while語句
7.8 switch語句
7.9 try-catch語句
8 空白
8.1 空行
8.2 空格
9 命名規(guī)范
10 編程慣例
10.1 提供對(duì)實(shí)例以及類變量的訪問控制
10.2 引用類變量和類方法
10.3 常量
10.4 變量賦值
10.5 其它慣例
10.5.1 圓括號(hào)
10.5.2 返回值
10.5.3 條件運(yùn)算符"?"前的表達(dá)式"?"前的表達(dá)式
10.5.4 特殊注釋
11 代碼范例
11.1 Java源文件范例
1 介紹(Introduction)
1.1 為什么要有編碼規(guī)范(Why Have Code Conventions)
編碼規(guī)范對(duì)于程序員而言尤為重要,有以下幾個(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)論意見請(qǐ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;
3.1.3 類和接口聲明(Class and Interface Declarations)
下表描述了類和接口聲明的各個(gè)部分以及它們出現(xiàn)的先后次序。參見"Java源文件范例"中一個(gè)包含注釋的例子。
類/接口聲明的各部分 注解
1 類/接口文檔注釋(/**……*/) 該注釋中所需包含的信息,參見"文檔注釋"
2 類或接口的聲明
3 類/接口實(shí)現(xiàn)的注釋(/*……*/)如果有必要的話 該注釋應(yīng)包含任何有關(guān)整個(gè)類或接口的信息,而這些信息又不適合作為類/接口文檔注釋。
4 類的(靜態(tài))變量 首先是類的公共變量,隨后是保護(hù)變量,再后是包一級(jí)別的變量(沒有訪問修飾符,access modifier),最后是私有變量。
5 實(shí)例變量 首先是公共級(jí)別的,隨后是保護(hù)級(jí)別的,再后是包一級(jí)別的(沒有訪問修飾符),最后是私有級(jí)別的。
6 構(gòu)造器
7 方法 這些方法應(yīng)該按功能,而非作用域或訪問權(quán)限,分組。例如,一個(gè)私有的類方法可以置于兩個(gè)公有的實(shí)例方法之間。其目的是為了更便于閱讀和理解代碼。
4 縮進(jìn)排版(Indentation)
4個(gè)空格常被作為縮進(jìn)排版的一個(gè)單位??s進(jìn)的確切解釋并未詳細(xì)指定(空格 vs. 制表符)。一個(gè)制表符等于8個(gè)空格(而非4個(gè))。
4.1 行長(zhǎng)度(Line Length)
盡量避免一行的長(zhǎng)度超過80個(gè)字符,因?yàn)楹芏嘟K端和工具不能很好處理之。
注意:用于文檔中的例子應(yīng)該使用更短的行長(zhǎng),長(zhǎ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á)式的開頭處對(duì)齊
- 如果以上規(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è)空格
//CONVENTIONAL INDENTATION
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...
}
//INDENT 8 SPACES TO 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 THIS INDENTATION
if ((condition1 condition2)
|| (condition3 condition4)
||!(condition5 condition6)) { //BAD WRAPS
doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS
}
//USE THIS INDENTATION 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)包括在注釋中。
在注釋里,對(duì)設(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)
塊注釋通常用于提供對(duì)文件,方法,數(shù)據(jù)結(jié)構(gòu)和算法的描述。塊注釋被置于每個(gè)文件的開始處以及每個(gè)方法之前。它們也可以被用于其他地方,比如方法內(nèi)部。在功能和方法內(nèi)部的塊注釋應(yīng)該和它們所描述的代碼具有一樣的縮進(jìn)格式。
塊注釋之首應(yīng)該有一個(gè)空行,用于把塊注釋和代碼分割開來,比如:
/*
* Here is a block comment.
*/
塊注釋可以以/*-開頭,這樣indent(1)就可以將之識(shí)別為一個(gè)代碼塊的開始,而不會(huì)重排它。
/*-
* Here is a block comment with some very special
* formatting that I want indent(1) to ignore.
*
* one
* two
* three
*/
注意:如果你不使用indent(1),就不必在代碼中使用/*-,或?yàn)樗丝赡軐?duì)你的代碼運(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 the condition. */
...
}
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 odd a */
}
5.1.4 行末注釋(End-Of-Line Comments)
注釋界定符"http://",可以注釋掉整行或者一行中的一部分。它一般不用于連續(xù)多行的注釋文本;然而,它可以用來注釋掉連續(xù)多行的代碼段。以下是所有三種風(fēng)格的例子:
if (foo 1) {
// Do a double-flip.
...
}
else {
return false; // Explain why here.
}
//if (bar 1) {
//
// // Do a triple-flip.
// ...
//}
//else {
// return false;
//}
5.2 文檔注釋(Documentation Comments)
注意:此處描述的注釋格式之范例,參見"Java源文件范例"
若想了解更多,參見"How to Write Doc Comments for Javadoc",其中包含了有關(guān)文檔注釋標(biāo)記的信息(@return, @param, @see):
若想了解更多有關(guān)文檔注釋和javadoc的詳細(xì)資料,參見javadoc的主頁:
文檔注釋描述Java的類、接口、構(gòu)造器,方法,以及字段(field)。每個(gè)文檔注釋都會(huì)被置于注釋定界符/**...*/之中,一個(gè)注釋對(duì)應(yīng)一個(gè)類、接口或成員。該注釋應(yīng)位于聲明之前:
/**
* The Example class provides ...
*/
public class Example { ...
注意頂層(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)編寫類和接口是,應(yīng)該遵守以下格式規(guī)則:
- 在方法名與其參數(shù)列表之前的左括號(hào)"("間不要有空格
- 左大括號(hào)"{"位于聲明語句同行的末尾
- 右大括號(hào)"}"另起一行,與相應(yīng)的聲明語句對(duì)齊,除非是一個(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 簡(jiǎn)單語句(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ù)合語句首行對(duì)齊。
- 大括號(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 else Statements)
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í)國(guó)家的英文雙字符代碼。包名的后續(xù)部分根據(jù)不同機(jī)構(gòu)各自內(nèi)部的命名規(guī)范而不盡相同。這類命名規(guī)范可能以特定目錄名的組成來區(qū)分部門(department),項(xiàng)目(project),機(jī)器(machine),或注冊(cè)名(login names)。 com.sun.eng
com.apple.quicktime.v2
edu.cmu.cs.bovik.cheese
類(Classes) 命名規(guī)則:類名是個(gè)一名詞,采用大小寫混合的方式,每個(gè)單詞的首字母大寫。盡量使你的類名簡(jiǎn)潔而富于描述。使用完整單詞,避免縮寫詞(除非該縮寫詞被更廣泛使用,像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)簡(jiǎn)短且富于描述。變量名的選用應(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 編程慣例(Programming Practices)
10.1 提供對(duì)實(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í)例變量聲明為公有是合適的。
當(dāng)前題目:字節(jié)java代碼規(guī)范 java字節(jié)碼表
文章源于:http://m.rwnh.cn/article8/doojhip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、品牌網(wǎng)站制作、面包屑導(dǎo)航、動(dòng)態(tài)網(wǎng)站、網(wǎng)站策劃、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)