主要參考了阿里巴巴開發規範,特此說明java
整體原則是: 對外接口必須寫;內部接口不建議使用 ,若是名字已經能夠解釋其意義,則不須要加註釋,若是不能解釋則能夠加數據庫
1)屬性註釋設計模式
/** xxx **/
private
String name;
public
void
setName(String name){
//xxx
do
();
}
1)類的成員順序:public > private > final > static > 實例成員;類結構:成員 > 構造方法 > 靜態方法 > 實例方法api
說明:一般使用者會更關注public 屬性/方法緩存
public
class
User{
public
final
static
String key1=
'key1'
;
public
static
String key2=
"key2"
;
public
String key3=
"key3"
;
private
String key4=
"key4"
;
public
User(){
}
public
static
void
setKey3(String key3){
}
public
void
setKey4(String key4){
}
private
void
foo(){
}
}
2)列限制:200,儘可能在一行顯示完整,超出須要換行,換行時遵循以下原則:數據結構
a 第二行相對第一行縮進 4 個空格,從第三行開始,再也不繼續縮進,參考示例。
b 運算符與下文一塊兒換行。
c 方法調用的點符號與下文一塊兒換行。併發
sb.append(
"zi"
).append(
"xin"
)...
.append(
"huang"
)...
.append(
"huang"
)...
.append(
"huang"
);
d 在多個參數超長,逗號後進行換行。
e 在括號前不要換行,以下反例app
method(args1, args2, args3, ...
,argsX);
public
static
String name;
private
int
id;
public
void
method1(){
}
public
void
method2(){
}
不能使用拼音進行命名,統一使用準確的英文進行命名框架
不採用簡寫方式命名(除公認的經常使用簡寫,或公司/小組字典表有描述)。命名過長比不能理解更好異步
1)、包名
2)、接口與類的命名
接口不要以 I 開頭。如:IUserService,而直接採用具體的命名方式如UserService
3)、抽象類命名
抽象類命名使用:Abstract+名詞的方式進行命名,如:AbstractMessage
4)、實現類命名
a 基於 SOA 的理念,暴露出來的服務必定是接口,內部的實現類用 Impl 的後綴與接口區別。例如UserServiceImpl
b 對於只有一個實現類的狀況(外部接口除外),一般先不採用接口方式,直接採用實現類便可
c 若是有多個實現類,則採用名稱+抽象名稱+Impl,如UserMessageImpl、AdminMessageImpl
5)、變量命名
a 全部變量(描述狀態的除外)統一以準確的名詞性英文命名,名詞性英文語法以下:
b 描述狀態的變量統一以準確的形容詞性英文命名,形容詞性英文語法以下:
c 對於反映狀態的變量,不要在命名前面加「is」,由於自動生成的get方法,對於boolean值,方面名自動會變爲is***
常量用全大寫,單詞之間用「_」分割,如:
public
static
final
String QUERYCLUBMEMBER_HQL=」…」;
d 對於成員變量,其名稱可省略所屬類的名稱,如:
public
class
User {
private
String userName;
//NOT GOOD
private
String name;
//GOOD
}
接口類中的方法和屬性不要加任何修飾符號 (public 也不要加 ,保持代碼的簡潔性)
public
interface
UserDao {
int
createUser(User user);
//NOT GOOD
int
create(User user);
//GOOD
}
接口、類的命名約定
類名
|
命名
|
示例
|
---|---|---|
Controller類 | **Controller | OrderController |
DAO層 | **Dao | UserDao |
Entity(領域對象) | 實體名 | User |
Interceptor類 | **Interceptor | AuthenticationInterceptor |
Servlet Filter類 | **Filter | ApplicationContextFilter |
Servlet類 | **Servlet | SystemInitServlet |
VO/DTO(視圖對象) | 實體名+VO | UserVO |
工具類命名 | ***Util | DateUtil |
系統監控器類 | **Monitor | MemcachedMonitor |
邏輯層類 | **Service | UserService |
b POJO 類命名約定
POJO類包含了Entity、VO。POJO 類中布爾類型的變量,都不要加 is ,不然部分框架解析會引發序列化錯誤。
c 常規方法的命名約定
方法名
|
示例
|
批量
|
備註
|
---|---|---|---|
列表 | list***(複數) listUsers | - | 若是返回爲空,則返回size=0的list,不能返回null |
建立 | create*** create createUser | batchCreate**s batchCreateUsers | |
刪除 | delete** delete deleteUser | batchDelete**s batchDeleteUsers | |
更新 | update** update updateUser | batchUpdate**s batchUpdateUsers | |
統計 | count*** | batchCount*** | |
獲取單個對象 | get** get getUser | batchGet**s batchGetUsers | |
獲取單個對象根據某個參數 | getBy** getByName | - |
說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利於理解和維護。
7)、控制語句
a 在一個 switch 塊內,每一個 case 要麼經過 break / return 等來終止,要麼註釋說明程序將繼續執行到哪個 case 爲止 ; 在一個 switch 塊內,都必須包含一個 default 語句而且放在最後,即便它什麼代碼也沒有。
b 在 if / else / for / while / do 語句中必須使用大括號,即便只有一行代碼,避免使用下面的形式: if (condition) statements;
c 推薦儘可能少用 else , if - else 的方式能夠改寫成:
if
(condition) {
...
return
obj;
}
boolean
existed = (file.open(fileName,
"w"
) !=
null
) && (...) || (...);
if
(existed) {
...
}
//NOT GOOD
public
int
insertUser() {
String name=request.get(
"name"
);
String password=request.get(
"password"
);
}
//GOOD
public
int
insertUser(String name,String password) {
}
public
class
TimerTaskThread
extends
Thread {
public
TimerTaskThread() {
super
.setName(
"TimerTaskThread"
); ...
}
一、不超過100行
二、嵌套層次不超過3層
例如if else try for while等這些控制代碼的層次不能過深,不然可讀性將會變得不好。儘可能保持平級,儘早返回或跳出。
三、一個函數不超過2個功能的具體代碼,能夠是引用
若是函數內有多個功能的具體代碼,會形成臨時變量過多,而且這些變量大可能是無相關的。會形成命名困難與容易引用變量出錯。