Java 命名約定

  1. Java 命名約定

除了以下幾個特例之外,命名時應始終采用完整的英文描述符。此外,一般應采用小寫字母,但類名、接口名以及任何非初始單詞的第一個字母要大寫。

1.1 一般概念

* 盡量使用完整的英文描述符

* 采用適用于相關領域的術語

* 采用大小寫混合使名字可讀

* 盡量少用縮寫,但如果用了,要明智地使用,且在整個工程中統一

* 避免使用長的名字(小于 15 個字母是個好主意)

* 避免使用類似的名字,或者僅僅是大小寫不同的名字

* 避免使用下劃線(除靜態常量等)

1.2 示范

* 包(Package) 采用完整的英文描述符,應該都是由小寫字母組成。對于全局包,將你的 Internet 域名反轉并接上包名。 如:

  java.awt 
 com.ambysoft.www.persistence 

* 類(Class) 采用完整的英文描述符,所有單詞的第一個字母大寫。 如:

  Customer 
 SavingsAccount 

* 接口(Interface) 采用完整的英文描述符說明接口封裝,所有單詞的第一個字母大寫。習慣上,名字后面加上后綴 able, ible 或者 er,但這不是必需的。如:

  Contactable 
 Prompter 

* 組件/部件(Component) 使用完整的英文描述來說明組件的用途,末端應接上組件類型。 如:

  okButton 
  customerList 
  fileMenu 

* 異常(Exception) 通常采用字母 e 表示異常。 e

* 類變量 字段采用完整的英文描述,第一個字母小寫,任何中間單詞的首字大寫,如:

 firstName 
      lastName 

* 實參/參數 同字段/屬性的命名規則

  public void setFirstName(String firstName){ 
        this.firstName = firstName; 
 } 

* 局部變量 同字段/屬性的命名規則

** 獲取成員函數 被訪問字段名的前面加上前綴 get。 getFirstName(), getLastName() 

** 布爾型的獲取成員函數 所有的布爾型獲取函數必須用單詞 is 做前綴。 isPersistent(), isString() 

** 設置成員函數 被訪問字段名的前面加上前綴 set。 setFirstName(), setLastName(),setWarpSpeed() 

** 普通成員函數 采用完整的英文描述說明成員函數功能,第一個單詞盡可能采用一個生動的動詞,第一個字母小寫。 openFile(), addAccount() 

* 靜態常量字段(static final) 全部采用大寫字母,單詞之間用下劃線分隔。 MIN_BALANCE, DEFAULT_DATE 

* 循環計數器 通常采用字母 i,j,k 或者 counter 都可以接受。 i, j, k, counter 

* 數組 數組應該總是用下面的方式來命名: byte[] buffer; 
  1. Java 注釋約定

一個很好的可遵循的有關注釋的經驗法則是:問問你自己,你如果從未見過這段代碼,要在合理的時間內有效地明白這段代碼,你需要哪些信息。

2.1. 一般概念

* 注釋應該增加代碼的清晰度

* 保持注釋的簡潔

* 在寫代碼之前寫注釋

* 注釋出為什么做了一些事,而不僅僅是做了什么

2.2. 示范 

* 文檔注釋
在緊靠接口、類、成員函數和字段聲明的前面注釋它們。
/**
*
* 客戶:客戶是我們將服務和產品賣給的人或機構。
*/

* C 語言風格
采用 C 語言風格的注釋去掉不再使用但你仍想保留的代碼。仍想保留是因為用戶萬一會改變想法,或者在調試過程中想讓它暫時失效。如:
/* 這部分代碼因為已被它之前的代碼取代,由 B.Gustafsson, 于 1999 年 6 月
*4 日注釋掉。如果兩年之后還未使用,將其刪除。. . .
*(源代碼)
*/

* 單行
在成員函數內采用單行注釋,來說明業務邏輯、代碼段和暫時變量的聲明。注釋符"http://"后必須緊跟一個空格,然后才是注釋信息。 如:
// 遵照 Sarek 的規定,給所有
// 超過 $1000 的發貨單
// 打 5% 的折扣。讓利活
// 動于 1995年 2 月開始.

2.3. 注釋哪些部分

類 類的目的、即類所完成的功能,注釋出采用的變量。

接口 設置接口的目的、它應如何被使用以及如何不被使用。

成員函數注釋 對于設置與獲取成員函數,在成員變量已有說明的情況下,可以不加注釋;普通成員函數要求說明完成什么功能,參數含義是什么返回什么;

普通成員函數內部注釋 控制結構,代碼做了些什么以及為什么這樣做,處理順序等。

實參/參數 參數含義、及其它任何約束或前提條件

字段/屬性 字段描述

局部變量 無特別意義的情況下不加注釋

  1. Java 文件樣式約定

所有的 Java(*.java) 文件都必須遵守如下的樣式規則:

1) 版權信息

版權信息必須在 java 文件的開頭,比如:

/**
* Copyright @ 2000 Shanghai XXX Co. Ltd.
* All right reserved.
* @author: gcgmh
* date: 2008-12-22
*/

其他不需要出現在 javadoc 的信息也可以包含在這里。

2) Package/Imports

package 行要在 import 行之前,import 中標準的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。

package hotlava.net.stats;

 import java.io.*; 
 import java.util.Observable; 
 import hotlava.util.Application; 

這里 java.io.* 是用來代替InputStream and OutputStream 的。

3) 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{
……
……
}

  1. Class Fields

接下來是類的成員變量:

/**
* Packet counters
*/
protected int[] packets;

public的成員變量必須生成文檔(JavaDoc)。proceted、private和 package 定義的成員變量如果名字含義明確的話,可以沒有注釋。

5) 存取方法(類的設置與獲取成員函數)

接下來是類變量的存取的方法。它只是簡單的用來將類的變量賦值獲取值的話,可以簡單的寫在一行上,如類的成員變量已經有注釋,類變量的存取方法可以沒有注釋。

public int[] getPackets() { return this.packets; }
public void setPackets(int[] packets) { this.packets = packets; }
……

要求說明的是,對于集合,加入成員函數來插入和刪除項;另其它的方法不要寫在一行上。

6) 構造函數

接下來是構造函數,它應該用遞增的方式寫(比如:參數多的寫在后面)。

public CounterSet(int size){ this.size = size;}

7) 克隆方法

如果這個類是可以被克隆的,那么下一步就是 clone 方法:

public Object clone() { try { …… }catch(CloneNotSupportedException e) { …… }}

8) 類方法 (類的普通成員函數)

下面開始寫類的方法:

/**

  • Set the packet counters
  • param r1 - ……
  • param r2 - ……
  • ……
    */
    protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4) throws IllegalArgumentException{
    // Ensure the arrays are of equal size
    ……
    }
  1. toString 方法

一般情況下,每一個類都應該定義 toString 方法:

public String toString() { ……}

10) main 方法

普通類,考慮置入一個main()方法,其中包含用于測試那個類的代碼,如果包含了main() 方法, 那么它應該寫在類的底部。

4. Java編碼其它約定

n 文檔化

必須用 javadoc 來為類生成文檔。不僅因為它是標準,這也是被各種 java 編譯器都認可的方法。使用 @author 標記是不被推薦的,因為代碼不應該是被個人擁有的。

n 縮進

縮進應該是每行2個空格。 不要在源文件中保存Tab字符, 在使用不同的源代碼管理工具時Tab字符將因為用戶設置的不同而擴展為不同的寬度。

如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字符, 方法是通過 UltrEdit中先設定 Tab 使用的長度室2個空格,然后用 Format|Tabs to Spaces 菜單將 Tab 轉換為空格。

n 頁寬

頁寬應該設置為80字符。 源代碼一般不會超過這個寬度, 并導致無法完整顯示, 但這一設置也可以靈活調整。 在任何情況下, 超長的語句應該在一個逗號或者一個操作符后折行。 一條語句折行后, 應該比原來的語句再縮進2個字符。

n {} 對

{} 中的語句應該單獨作為一行。 例如, 下面的第1行是錯誤的, 第2行是正確的:

if (i>0) { i ++ }; // 錯誤, { 和 } 在同一行 if (i>0) { i ++ }; // 正確, 單獨作為一行

n 括號

左括號和后一個字符之間不應該出現空格; 同樣, 右括號和前一個字符之間也不應該出現空格。 下面的例子說明括號和空格的錯誤及正確使用:

CallProc(AParameter); // 正確

不要在語句中使用無意義的括號,括號只應該為達到某種目的而出現在源代碼中。

n JSP文件命名

采用完整的英文描述說明JSP所完成的功能,盡可能包括一個生動的動詞,第一個字母小寫,如:viewMessage.jsp、editUser.jsp或者forumChooser.jsp等。

n Servlet類命名

一般對應于所服務的對象加后綴Service來命名,如:UserService,TradeService等。

5. 一些編程建議

n 使用 StringBuffer 對象

在處理 String 的時候要盡量使用 StringBuffer 類,StringBuffer 類是構成 String 類的基礎。String 類將 StringBuffer 類封裝了起來,(以花費更多時間為代價)為開發人員提供了一個安全的接口。當我們在構造字符串的時候,我們應該用 StringBuffer 來實現大部分的工作,當工作完成后將 StringBuffer 對象再轉換為需要的 String 對象。比如:如果有一個字符串必須不斷地在其后添加許多字符來完成構造,那么我們應該使用 StringBuffer 對象和它的 append() 方法。如果我們用 String 對象代替 StringBuffer 對象的話,會花費許多不必要的創建和釋放對象的 CPU 時間。

n 避免太多的使用 synchronized 關鍵字

避免不必要的使用關鍵字 synchronized,應該在必要的時候再使用它,這是一個避免死鎖的好方法。 必須使用時,也盡量控制范圍,最好在塊級控制。

n 避免使用 java.util.Vector 類

因為"Unlike the new collection implementations, Vector is synchronized.",所以使用java.util.Vector類在性能上會有所減低。

n 盡量使用接口而不是一個具體的類

比方如下需求,給定一個SQL語句,返回一個對象的列表,實現中用java.util.ArrayList實現,于是定義方法為:

public java.util.ArrayList getObjectItems(String sql)

上面的方法存在一個問題,當getObjectItems內改用Vector或LinkedList實現,外部類必須做相應更改。一個更好的方法是定義返回值為java.util.AbstractList更合適:

public java.util.AbstractList getObjectItems(String sql)

這樣即使更改實現,外部類也不必做相應更改。

n 避免使用索引來調用數據庫中間層組件返回的結果集

如:

for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, 0).toString(); ……}

而應用字段名來存取結果集:

for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, "field1").toString(); ……}

這樣在數據庫設計更改或查詢的SQL語句發生變化時,不會影響到程序的執行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,142評論 0 62
  • 后來的我們無論是后來故事怎么了,也要讓后來人生精彩著,后來的我們,我期待著淚水中能看到,你真的自由了。——《后來的...
    安寂染閱讀 903評論 10 10
  • 今天王寶強離婚的消息吵得沸沸揚揚。雙方各執一詞,撕逼大戰即將打開。① 別的不談,女方微博并沒有否認婚外關系,那看來...
    佳佳思行錄閱讀 318評論 0 1