在上一篇的java編程風格學習(二)中我們學習了一些在Java編碼過程中的格式規范,遵循這些規范毋庸置疑是我們的書寫高質量代碼的前提與基礎。今天我們更進一步,一起來學習Java編程的命名規范,向着編寫高質量代碼的終極目標進發。
(一)編程語言的通用規范
在詳細介紹Java元素的命名規范之前我們首先來看一下所有語言通用的一些編碼規則。
1.名稱應該有實際意義
當我們為變量、方法、類或者常量命名的時候應該使用對閱讀者來說是具有實際意義的名稱,避免使用單個字母或者通用名。
我們首先來看下面這一段代碼:
if (a < 65) {
y = 65 - a;
}
else {
y = 0;
}
在上面這段代碼中,雖然我們能理清代碼的執行過程,但是卻不能判斷出變量a和常數65的意義,這毫無疑問讓我們很難理解這段代碼的實際意義。
如果我們使用具有實際意義的名稱來替換代碼中的字母變量和常量,這段代碼將十分容易理解。
if (age < RETIREMNT_AGE) {
yearsToRetirement = RETIREMNT_AGE - age;
}
else {
yearsToRetirement = 0;
}
這種命名規則有一個例外情況,就是臨時變量的命名。
for (int i = 0; i < numberOfStudents; i++) {
enrollStudent(i);
}
臨時變量的意義通過上下文的充足信息我們就可以判斷出來,無需為其單獨命名。
2.使用人們熟悉的名稱
使用閱讀者所熟悉的領域中的術語。如果閱讀者習慣使用“customer”這個詞,就不要使用“client”。當領域或者目標行業已經存在通用術語時,開發人員就不應該再采用非通用術語或者自己造新詞。
3.謹慎使用過長的名稱
如果類、接口、變量和方法的名稱過長,那就說明這個實體的定義十分復雜。在給一個實體命名時,我們首先要考慮的是它的設計和用途,通過建立更具有針對性的類、接口、方法和變量來構成這些實體,並且給它們更簡單有意義的名稱。
4.不要使用只依賴大小寫來區分的名字
雖然Java編譯器可以區分那些大小寫不同的名字,但是人在閱讀時是很難注意到差別的,這就很容易對讀者造成誤導。
比如,變量theSQLInputStream
和變量theSqlInputStream
是不應該出現在同一個作用域的。
(二)Java語言編程規范
1.常量命名
常量的每個單詞均大寫,單詞之間使用下划線連接。用大寫字母命名常量可以和其他非final型變量相區分開。
class Byte {
public static final byte MAX_VALUE = 255;
public static final byte MIN_VALUE = 0;
}
2.變量命名
(1)使用名詞來命名變量,變量名中的第一個單詞小寫,其后的每一個單詞的第一個字母大寫。
變量就是一個對象、事物,我們使用名稱表示。大寫能區分名詞中的每一個單詞,首字母小寫則可以區分變量名和類名。
(2)集合引用名要使用復數形式
對象集合的字段和變量的名字要使用集合里包含的對象類型的復數形式,這便於區分多值變量和單值變量。
Customer[] customers = new Customer[MAX_CUSTOMERS];
void addCustomer(int index,Customer customer) {
this.customer[index] = customer;
}
Vector orderItems = new Vector();
void addOrderItems(OrdetItem orderItem) {
this.orderItems.addElement(orderItem);
}
(3)為不重要的臨時變量建立一套標准名稱
大多數變量的名字要使用完整的表述,但是也有很多經常出現的變量使用簡寫形式。
下面是幾個比較常用的例子:
- 字符--------c,d,e
- 坐標--------x,y,z
- 異常--------e
- 圖形--------g
- 對象--------o
- 流 ----------in,out
- 字符串-----s
(4)字段、參數命名
我們在使用構造方法或者set
方法給字段賦值時,應該為參數名和字段使用相同名稱,在方法內部使用this
關鍵字來區分局部變量和字段變量。
class Student {
private String name;
public Student(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
}
3.方法命名
(1)使用動詞命名方法,方法名中的第一個單詞小寫,其后的每個單詞的第一個字母大寫。
方法表示動作,采用動詞命名。大寫可以把名字里的各個單詞很明確的區分開,首字母小寫則可以將方法調用和構造方法區分開。
class Account {
private int balance;
public Account(int balance) {
this.balance = balance;
}
public void withdraw(int amount) {
deposit(-1 * amount);
}
public void deposit(int amount) {
this.balance += amount;
}
}
(2)遵循JavaBeans中屬性訪問函數的方法的命名規范
JavaBeans規范為方法建立了一套命名規范,用來訪問JavaBeans實現的屬性。在任何類中定義方法都應該使用這些規范,無論是否實現了Bean。
JavaBean用is開頭的方法公開boolean屬性:
boolean isValid() {
return this.isValid;
}
JavaBean用get開頭的方法對其他屬性進行訪問:
string getName() {
return this.name;
}
JavaBean用set開頭的方法對屬性進行寫入操作:
void setName() {
this.name = name;
}
4.類命名
采用名詞命名類,類名中的每個單詞的第一個字母大寫。
類用來定義對象或者事物,應該采用名詞形式。大寫可以明顯地區分名字中各個單詞,首字母大寫則可以區分變量名以及類名或者接口名。
class CustomerAccount {
···
}
5.接口命名
采用名詞或者形容詞命名接口,接口中的每個單詞的第一個字母大寫。
接口描述一個對象的能力或者使聲明對象能夠提供的服務。
a.使用名詞給作為服務聲明的接口命名:
public interface ActionListener {
public void actionPerformed(ActionEvent e);
}
b.使用形容詞來為描述某種能力的接口命名:
public interface Runnable {
public void run();
}
大多數的接口命名都是采用形容詞,這些形容詞由動詞加上able或者ible后綴得來。更能表示接口是表示一種能力的本質含義。
6.包命名
(1)使用單獨的小寫動詞作為每個包的根名
包名里必須包含一個單獨的小寫詞,能夠清晰體現包的用途。包名也可以包含一個有實際意義的縮寫,例如Java標准包的java.io
。
(2)用你所在組織的域名的倒序小寫的形式作為包名字的根限定詞
例如,一個公司的域名為 weikanwave.com,該公司發布了一款名為server的服務器應用程序,那么該公司將該包命名為com.weikanwave.server。
以上內容就是本篇文章的全部內容,如果有補充或者不妥之處還請各位不吝賜教,下一篇我們將學習Java的文檔規范。