Java編碼規範

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/xionghuilin123/article/details/49634215

近日,閒來無事。時常想着做的什麼東西,青春不是用來揮霍的,而是用來奮鬥的。常常在我們身邊人民總是說程序猿如何如何苦逼。貌似我們自己也經常這麼自黑。我們其實大多數人都是勞苦大衆。老爸既不是王健林,也不是李剛。我們有的只是擺好自己的心態,身在其位,便要學着樂在其中。好了,廢話了這麼久~~,想表達的貌似說的也不怎麼明白。回到正軌

Java編碼規範

每個程序員在編碼中都有自己的習慣,也說不出那個更好。但是在公司中一個項目不可能是一人開發。規範自己的代碼,別人看起來一目瞭然。當然你說代碼一目瞭然,爲什麼在網站上看到的前端代碼還是亂糟糟的。這裏絕不可能是開發過程中就這樣。這樣不是害自己嗎,我想也不會有人這麼幹。這裏說明兩點原因:

1.大多數網站都不是純html,css開發。可能在後期渲染之後呈現到前端就是這種效果咯

2.出於安全的考慮,在項目上線部署階段將其打亂。防止他人通過前端代碼找到系統漏洞(沒人敢保證自己的系統十分安全)。

這裏說一下Sun公司提供的編碼規範

類名:全部用大駝峯(首字母全部大寫) ps:基本上框架Spring,hibernate,struts batis等框架都是這麼幹的

變量名:全部小寫,除了靜態變量全部大寫。

方法名:小駝峯(除第一個英文首字母小寫,其他首字母大寫).

縮進排版:4個空格常被作爲縮進排版的一個單位。一個製表符相當於8個空格(而非4個)我們在eclipse上默認是一個製表符

換行:當一個表達式無法容納在一行內時,可以依據如下一般規則斷開之:

4.2 換行(Wrapping Lines)

當一個表達式無法容納在一行內時,可以依據如下一般規則斷開之:

◆  在一個逗號後面斷開。

◆  在一個操作符前面斷開。

◆  寧可選擇較高級別的(higher-level)的斷開,而非較低級別(lower-level)的斷開。

◆  新的一行應該與上一行同一級別表達式的開頭處對齊。

◆  如果以上規則導致你的代碼混亂或者使你的代碼都堆擠在右邊,那就代之以縮進8個空格。

以下是斷開方法的一些例子:

someMethod(longExpression1, longExpression2, longExpression3, 

longExpression4, longExpression5);

var = someMethod1(Expression1, 

someMethod2(longExpression2,

longExpression3));

以下是兩個斷開算術表達式的例子。前者更好,因爲斷開處位於括號表達式的外邊,這是個較高級別的斷開。

longName1 = longName2 * (longName3 + longName4- longNeme5)

+ 4 * longName6); //PREFFER

longName1 = longName2 * (longName3 + longName4

- longName5) + 4 * longName6; //AVOID

以下是兩個縮進方法聲明的例子。前者是常規情形,後者若使用常規的縮進方式將會使第二行和第三行移得很靠右,所以代這以縮進8個空格。

// CONVENTION 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個空格的規則,因爲常規縮進(4個空格)會使語句看起來比較費勁。比如:

//DON’T USE THIS INDENTATION

if ((condition1 && condition2)

|| (condition3 && condition4)

|| !(condition5 && condition6)) { //BAD WRAPS

doSomethingAboutIt(); // MAKE THIS LING 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)) {

    doSomthingAoutIt();

}

這裏有三種可行的方法用於處理三元運算表達式:

alpha = (aLongBooleanExpression) ? beta : gamma;

alpha = (aLongBooleanExpression) ? beta

                                 : gamma;

alpha = (aLongBooleanExpression)

           ? beta

           : gamma;

5. 註釋(Comments)

Java程序有兩類註釋:實現註釋(implementation comments)和文檔註釋(document comments)。實現註釋是那些在C++中見過的,使用/*…*///界定的註釋。文檔註釋(被稱爲“doc comments)Java獨有的,並由/**…*/界定。文檔註釋可以通過javadoc工具轉換成HTML文件。

實現註釋用以註釋代碼或或者實現細節。文檔註釋從實現自由(implemtentation-free)的角度描述代碼的規範。它可以被那些手頭沒有源碼的開發人員讀懂。

註釋應被用來給出代碼的總括,並提供代碼自身沒有提供的附加信息。註釋應該僅包含與閱讀和理解程序有關的信息。例如,相應的包如何被建立或位於哪個目錄下之類的信息不應包括在註釋中。

在註釋裏,對設計決策中重要的或者不是顯而易見的地方進行說明是可以的,但應避免提供代碼中已清晰表達出來的重複信息,多餘的註釋很容易過時。通常應避免那些代碼更新就可能過時的註釋。

注意:頻繁的註釋有時反映出代碼的低質量。當你覺得被迫要加註釋的時候,考慮一下重寫代碼使其更清晰。

註釋不應寫在用星號或字符畫出來的大框裏。註釋不應包括諸如製表符和回退符之類 的特殊字符。

5.1 實現註釋的格式(Implementation Comment Formats)

程序可以有4種實現註釋的風格:塊(Block),單行(single-line),尾端(trailing)和行末(end-of-line)

5.1.1 塊註釋

塊註釋通常用於提供對文件,方法,數據結構和算法的描述。塊註釋被置於每個文件的開始處以及每個方法之前。它們也可以被用於其他地方,比如方法的內部。在功能和方法內部的塊註釋應該和它們所描述的代碼具有一樣的縮進格式。

塊註釋之首應該有一個空行,用於把塊註釋和代碼分割開來,比如:

        / *

             * Here is a block comment.

         */

塊註釋可以以/ *-開頭,這樣indent(1)就可以將之識別爲一個代碼塊的開始,而不會重排它。

        / *-

         * Here is a block comment with some very special

         * formatting that I want indent(1) to ignore.

         *

         *    one

         *       two

         *          three

         */

注意:如果你不使用indent(1),就不必在代碼中使用/ *-, 或爲他人可能對你的代碼運行indent(1)讓步。

參見“文檔註釋”。

5.1.2 單行註釋(Single-Line Comments)

短註釋可以顯示一行內,並與其後的代碼具有一樣的縮進層級。如果一個註釋不能在一行內寫完,就該塊註釋(參見“塊註釋”)。單行註釋之前應該有一個空行。以下是一個Java代碼中單行註釋的例子:

if (condition) {

        

/ * Handle the condition. */

……

}

5.1.3 尾端註釋(Trailing Comments)

極短的註釋可以與它們所要描述的代碼位於同一行,但是應該有足夠的空白來分開代碼和註釋。若有多個短註釋出現於大段代碼中,它們應該具有相同的縮進。

以下是一個Java代碼中尾端註釋的例子:

        if (a ==2) {

            return TRUE;            / * special case */

        } else {

            return isPrime(a);         / * works only for odd a */

        }

5.1.4 行末註釋(End-Of-Line Comments)

註釋界定符“//”,可以註釋掉整行或者一行中的一部分。它一般不用於連續多行的註釋文本;然而,它可以用來註釋掉多行的代碼段。以下是所有三種風格的例子:

        if(foo > 1) {

            // Do a double-filp.

            ……

        }

        else {

            return false;

        }

 

        // if (bar > 1) {

        //

        //     // Do a triple-filp.

        //     ……

        // }

        // else {

        //     return false;

        // }

5.2 文檔註釋(Documentation Comments)

注意:此處描述的註釋格式之範例,參見“Java源文件範例”

若想了解更多,參見“How to Write Doc Comments for Javadoc”,其中包含了有關文檔註釋標記的信息(@return@param@see)

http://java.sun.com/javadoc/writingdoccomments/index.html

若想了解有關文檔註釋和javadoc的詳細資料,參見javadoc的主頁:

    http://java.sun.com/javadoc/index.html

文檔註釋描述Java的類、接口、構造器、方法,以及字段(field)。每個文檔註釋都會被置於註釋界定符/ **…*/之中,一個註釋對應一個類、接口或成員。該註釋應位於聲明之前:

        / **

         * The Example class provides …

         */

public class Example { …

注意:頂層(top-level)的類和接口是不縮進的,而其成員是縮進的。描述類和接口的文檔註釋的第一行會被置於註釋的第一行(/ **)不需要縮進;隨後的文檔註釋每行都縮進1(使星號縱向對齊)。成員,包括構造函數在內,其文檔註釋的第一行縮進4格,隨後每行都縮進5格。

若你想給出有關類、接口、變量或方法的信息,而這些信息又不適合寫在文檔中,則可使用實現塊註釋(5.1.1)或緊跟在聲明後面的單行註釋(5.1.2)。例如,有關一個類實現的細節應放入緊跟在類聲明後面的實現塊註釋中,而不是放在文檔註釋中。

文檔註釋不能放在一個方法或構造器的定義塊中,因爲Java會將位於文檔註釋之後的第一個聲明與其相關聯。

6. 聲明(Declaration)

6.1 每行聲明變量的數量(Number Per Line)

推薦一行一個聲明,因爲這樣以利於寫註釋。亦即,

int level; // indentation level

        int size; // size of table

要優於,

int level, size;

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

    int foo, fooarry[]; // WRONG!

注意:上面的例子中,在類型和標識之間放了一個空格,另一種被允許的替代方法是使用製表符:

int level;                // indentation level

int size;                // size of table

        Object currentEntry;     // currently selected table entry

6.2 初始化(Initialization)

儘量在聲明局部變量的同時進行初始化。唯一 不這麼做理由是變量的初始值依賴於某些先前發生的計算。

6.3 佈局(Placement)

只在代碼塊的開始處聲明變量(一個塊是指任何被包含在大括號“{”和“}”中間的代碼)。不要在首次用於該變量時才聲明之,這會把注意力不集中的程序員搞糊塗,同時會妨礙代碼在該作用域內的可移植性。

        void myMethod() {

            int int1 = 0;

            if (condition) {

                int int2 = 0;

                …

            }

        }

該規則的一個例外是for循環的索引變量

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

避免聲明的局部變量覆蓋上一級聲明的變量。例如,不要在內部代碼塊中聲明相同的變量名:

        int count;

        …

        myMethod() {

            if (condition) {

                int count = 0;    // AVOID

                …

            }

            …

        }

6.4 類和接口的聲明(Class and Interface Declarations)

當編寫類和接口時,應該遵守以下格式規則:1

◆  在方法名與其參數列表之前的左括號“(”間不要有空格。

◆  左大括號“{”位於聲明語句同行的末尾。

◆  右大括號“}”另起一行,與相應的聲明語句對齊,除非是一個空語句,“}”應緊跟在“{”之後。

        class Sample extends Object {

            int ivar1;

            int ivar2;

            Sample(int i, int j) {

                ivar1 = i;

                ivar2 = j;

            }

 

            int emptyMethod() {}

            …

        }

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

7. 語句(Statements)

7.1 簡單語句(Single Statement)

每行至多包含一條語句,例如:

        argv++;          // Correct

        argc--;           // Correct

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

7.2 複合語句(Compound Statements)

複合語句是包含在大括號中的語句序列,形如“語句 }”。例如下面各段。

◆  被括其中的語句應該較之複合語句縮進一個層次。

◆  左大括號“{”應位於複合語句起始行的行尾;右大括號“}”應另起一行並與複合語句首行對齊。

◆  大括號可以被用於所有語句,包括單個語句,只要這些語句是諸如if – elsefor控制結構的一部分。這樣便於添加語句而無需擔心由於忘了加括號而引入bug.

7.3 返回語句(return Statements)s

一個帶返回值的return語句不使用小括號“()”,除非它們以某種方式使返回值更顯見。例如:

        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語句應該具有如下格式:

if (condition) {

            statements;

        }

 

        if (condition) {

            statements;

        } else {

            statements;

        }

 

        if (condition) {

            statements;

        } else if (condition) {

            statements;

        } else if (condition) {

            statements;

        }

注意:if語句問題用“{”和“}”括起來,避免使用如下容易引起錯誤的格式:

        if (condition)  // AVOI! THIS OMITS THE BRACES {}!

            statement;

7.5 for語句(for Statements)

一個for語句應該具有如下格式:

        for (initialization; condition; update) {

            statements;

        }

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

        for (initialization; condition; update);

當在for語句的初始化或更新子句中使用逗號時,避免因使用三個以上變量,而導致複雜度提高。若需要,可以在for循環之前(爲初始化子句)for循環末尾(爲更新子句)使用單獨的語句。

7.6 while語句(while Statements)

一個while語句應該具有如下格式:

        while (condition) {

            statements;

        }

一個空的while語句應該具有如下格式:

        while (condition);

7.7 do-while語句(do-while Statements)

一個do-while語句應該具有如下格式:

        do {

            statements;

        } while (condition);

7.8 switch語句(switch Statements)

一個switch語句應該具有如下格式:

        switch (condition) {

        case ABC:

                statements;

                / * falls through */

        case DEF:

                statements;

                break;

        case XYZ:

                statements;

                break;

        }

每當一個case順着往下執行時(因爲沒有break語句),通常應在break語句的位置添加註釋。上面的示例代碼中就包含註釋/ * falls through */

7.9 try-catch語句(try-catch Statements)

一個try-catch語句應該具有如下格式:

        try {

            statements;

        } catch (ExceptionClass e) {

            statements;

        }

一個try-catch語句後面也可能跟着一個finally語句,不論try代碼塊是否順利執行完,它都會被執行。

        try {

            statements;

        } catch (ExceptionClass e) {

            statements;

        } finally {

            statements;

        }

8. 空白(White Space)

8.1 空行(Blank Lines)

空行將邏輯相關的代碼段分隔開,以提高可讀性。

下列情況應總是使用兩個空行:

◆  一個源文件的兩個片段(section)之間。

◆  類聲明和接口聲明之間。

下列情況應該總是使用一個空行:

◆  兩個方法之間。

◆  方法內的局部變量和方法的第一條語句之間。

◆  塊註釋(參見“5.1.1)或單行註釋(參見5.1.2)之前。

◆  一個方法內的兩個邏輯段之間,用以提高可讀性。

8.2 空格(Blank Spaces)

下列情況應該使用空格:

◆  一個緊跟着括號的關鍵應該被空格分開,例如:

    while (true) {

        ….

    }

    注意:空格不應該置於方法名與其左括號之間,這將有助於區分關鍵字和方法調用。

◆  空白應該位於參數列表中逗號的後面。

◆  所有的二元運算符,除了“.”,應該使用空格將之與操作數分開。一元操作符和操作數之間不應該加空格,比如:負號(-),自增(++)和自減(--)。例如:

    a += c + d;

    a = (a + b) / (c * d);

 

        while (d++ + s++) {

            n++;

        }

        printSize(“size is ” + foo + “\n”);

◆  for語句中的表達式應該被空格分開,例如:

    for (expr1; expr2; expr3)

◆ 強制轉型後應該跟一個空格,例如:

myMethod((byte) aNum, (Object) x);

myMethod((int) (cp + 5), ((int) (i + 3)) + 1);

9. 命名規範(Naming Convention) 

9.1(Packages)

一個唯一包名的前綴總是全部小寫的ASCⅡ字母並且是一個頂級域名,通常是com,gov,edu,mil,net,org,或1981年ISO 3166標準所指定的標識的國家的英文雙字符代碼。包名的後續部分根據不同機構各自內部的命名規範而不盡相同。這類命名規範可能以特定目錄名的組成來區分部門(department),項目(project),機器(machine),或註冊名(login names)

例如:

com.sun.eng

com.apple.quicktime.v2

edu.cmu.cs.bovik.cheese

9.2(Classes)

類名是一個名詞,採用大小寫混合方式,每個單詞的首字母大寫。儘量使你的類名簡潔而富於描述。使用完整單詞,避免縮寫詞(除非該縮寫詞被廣泛的使用,如URLHTML)

例如:

class Raster

class ImageSprite

9.3接口(Interfaces)

interface RasterDelegate

interface Storing

9.4方法(Methods)

方法名是一個動詞,採用大小寫混合方式,第一個單詞的首字母小寫,其後單詞的首字母大寫。

例如:

run()

runFase()

getBackground()

9.5變量(Variables)

除了變量名外,所有實例,包括類,類常量,均採用大小寫混合的方式,第一個單詞的首字母小寫,其後單詞的首字母大寫。變量名不應以下劃線或美元符號開頭,儘管這在語法上是允許的。

例如:

char c

int i

float myWidth

9.6實例變量(Instance Variables)

實例變量名應簡短且富於描述。變量名的選用應該易於記憶,即,能夠指出其用途。儘量避免單個字符的變量名,除非是一個性臨時變量。臨時變量通常被取名爲ijkmn,它們一般用於整形;cde,它們一般用於字符型。

int _employeeld

String _name

Customer _customer

9.7常量(Constants)

大小寫規則和變量名相似,除了前面需要一個下劃線隔開。儘量避免ANSI常量,容易引起錯誤。

例如:

static final int MIN_WIDTH = 4

static final int MAX_WIDTH = 999

static final int GET_THE_CPU = 1

   命名規範使程序更易讀,從而更易於理解。它們也可以提供一些有關標識符功能的信息,以助於理解代碼。例如,不論它是一個常量、包,還是類(9.7的例子所示)

    10. 編程慣例(Programming Practices)

10.1 提供對實例以及類變量的訪問控制(Providing Access to Instance and Class Variables)

若沒有足夠的理由,不要把實例或類類變量聲明爲public。通常,實例變量無需顯式的設置(set)和獲取(gotten),通常這作爲方法調用的邊緣效應(side effect)而產生。

一個具有public實例變量的恰當例子,是類僅作爲數據結構,沒有行爲。亦即,若你要使用一個結構(struct)而非一個類(如果Java支持結構的話),那麼把類的實例變量聲明爲public是合適的。

10.2 引用類變量和類方法(Referring to Class Variables and Methods)

避免用一個對象訪問一個類的靜態變量和方法。應該用類名替代。例如:

    classMethod();         // OK

    AClass.classMethod();   // OK

    anObject.classMethod();  // AVOID!

10.3常量(Constants)

位於for循環中作爲計數器值的數字常量,除了-101之外,不應被直接寫入代碼。

10.4 變量賦值(Variable Assignments)

避免在一個語句中給多個變量賦相同的值。它很難讀懂。例如:

fooBar.fChar = barFoo.lchar = ‘c’;  // AVOID!

不要將賦值運算符用在容易與相等關係運算符混淆的地方。例如:

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

        ….

    }

應該寫成

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

        …

    }

不要使用內嵌(embedded)賦值運算符試圖提高運行時效率,這是編譯器的工作。例如:

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

應該寫成

    a = b + c;

    d = a + r;

10.5 其它慣例(Miscellaneous Practices)

10.5.1 圓括號(Parentheses)

一般而言,在含有多種運算符的表達式中使用括號來避免運算符優先級問題,是個好方法。即便運算符的優先級對你而言可能很清楚,但對其他人未必如此。你不能假設別的程序員和你一樣清楚運算符的優先級。

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

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

10.5.2 返回值(Returning Values)

設法讓你的程序結構符合目的。例如:

    if (booleanException) {

        return true;

    else {

        return false;

    }

應該代之以如下方法:

    return booleanException;

類似地:

if (condition) {

        return x;

    }

    return y;

應該寫爲:

    return (condition ? x : y);

10.5.3 條件運算符“?”前的表達式(Expressions before “?” in the Conditional Operator)

如果一個包含二元運算符表達式出現在三元運算符“ ? : ”之前,那麼應該給表達式添上一對圓括號。例如:

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

10.5.4 特殊註釋(Special Comments)

在註釋中使用XXX來標識某些方法未實現(bogus)的但可以工作的內容。用FIXME來標識某些假的和錯誤的內容。

11. 代碼範例(Code Examples)

11.1 Java源文件範例(Java Source File Example)

下面的例子,展示瞭如何合理佈局一個包含單一公共類的Java源程序。接口的佈局與其相似。更多信息參見“類和接口”以及“文檔註釋”。


        /*

         * @(#)Blah.java    1.82 99/03/18

         *

         * Copyright (c) 1994-199 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.

         */

        package java.blah;

 

        import java.blah.blahdy.BlahBlah;

 

        /**

         * Class description goes here.

         *

         * @verison 1.82 18 Mar 1999

         * @author Firsname Lastname

         */

        public class Blah extends SomeClass {

            /* A class implementation comment can go here. */

 

            /** class Var1 documentation comment */

         public static int classVar1;

 

            /**

             * classVar2 documentation comment that happen to be

         * more than one line long

             */

            private static Object classVar2;

 

            /** instanceVar2 documentation comment */

            public Object instanceVar1;

 

            /** instanceVar3 documentation comment */

            private Object[] instanceVar3;

 

            /**

             * constructor Blah documentation comment

             */

            public Blah() {

                //implementation goes here

            }

 

            /**

             * method doSomething documentation comment

             */

            public void doSomething() {

                //implementation goes here

            }

 

            /**

             * method doSomethingElse documentation

             * comment

             * @param someParam description

             */

            public void doSomethingElse(Object someParam) {

                //implementation goes here

            }

        }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章