告別編碼5分鐘,命名2小時!史上最全的Java命名規範參考!

簡潔清爽的代碼風格應該是大多數工程師所期待的。在工做中筆者經常由於起名字而糾結,誇張點能夠說是編程5分鐘,命名兩小時!究竟爲何命名成爲了工做中的攔路虎。html

每一個公司都有不一樣的標準,目的是爲了保持統一,減小溝通成本,提高團隊研發效能。因此本文中是筆者結合阿里巴巴開發規範,以及工做中的見聞針對Java領域相關命名進行整理和總結,僅供參考。java

一,Java中的命名規範

好的命名能體現出代碼的特徵,含義或者是用途,讓閱讀者能夠根據名稱的含義快速釐清程序的脈絡。不一樣語言中採用的命名形式截然不同,Java中經常使用到的命名形式共有三種,既首字母大寫的UpperCamelCase,首字母小寫的lowerCamelCase以及所有大寫的並用下劃線分割單詞的UPPER_CAMEL_UNSER_SCORE。一般約定,類通常採用大駝峯命名,方法和局部變量使用小駝峯命名,而大寫下劃線命名一般是常量和枚舉中使用。git

類型 約束
項目名 所有小寫,多個單詞用中劃線分隔‘-’ spring-cloud
包名 所有小寫 com.alibaba.fastjson
類名 單詞首字母大寫 Feature, ParserConfig,DefaultFieldDeserializer
變量名 首字母小寫,多個單詞組成時,除首個單詞,其餘單詞首字母都要大寫 password, userName
常量名 所有大寫,多個單詞,用'_'分隔 CACHE_EXPIRED_TIME
方法 同變量 read(), readObject(), getById()

二,包命名

包名統一使用小寫點分隔符之間有且僅有一個天然語義的英文單詞或者多個單詞天然鏈接到一塊(如 springframework,deepspace不須要使用任何分割)。包名統一使用單數形式,若是類命有複數含義,則可使用複數形式。程序員

包名的構成能夠分爲如下幾四部分【前綴】 【發起者名】【項目名】【模塊名】。常見的前綴能夠分爲如下幾種:github

前綴名 含義
indi(或onem ) indi.發起者名.項目名.模塊名.…… 個體項目,指我的發起,但非本身獨自完成的項目,可公開或私有項目,copyright主要屬於發起者。
pers pers.我的名.項目名.模塊名.…… 我的項目,指我的發起,獨自完成,可分享的項目,copyright主要屬於我的
priv priv.我的名.項目名.模塊名.…… 私有項目,指我的發起,獨自完成,非公開的私人使用的項目,copyright屬於我的。
team team.團隊名.項目名.模塊名.…… 團隊項目,指由團隊發起,並由該團隊開發的項目,copyright屬於該團隊全部
頂級域名 com.公司名.項目名.模塊名.…… 公司項目,copyright由項目發起的公司全部

三,類命名

類名使用大駝峯命名形式,類命一般時名詞或名詞短語,接口名除了用名詞和名詞短語之外,還可使用形容詞或形容詞短語,如Cloneable,Callable等,表示實現該接口的類有某種功能或能力。對於測試類則以它要測試的類開頭,以Test結尾,如HashMapTest。spring

對於一些特殊特有名詞縮寫也可使用全大寫命名,好比XMLHttpRequest,不過筆者認爲縮寫三個字母之內都大寫,超過三個字母則按照要給單詞算。這個沒有標準如阿里巴巴中fastjson用JSONObject做爲類命,而google則使用JsonObjectRequest命名,對於這種特殊的縮寫,原則是統一就好。chrome

屬性 約束
抽象類 Abstract 或者 Base 開頭 BaseUserService
枚舉類 Enum 做爲後綴 GenderEnum
工具類 Utils做爲後綴 StringUtils
異常類 Exception結尾 RuntimeException
接口實現類 接口名+ Impl UserServiceImpl
領域模型相關 /DO/DTO/VO/DAO 正例:UserDAO 反例: UserDo, UserDao
設計模式相關類 Builder,Factory等 當使用到設計模式時,須要使用對應的設計模式做爲後綴,如ThreadFactory
處理特定功能的 Handler,Predicate, Validator 表示處理器,校驗器,斷言,這些類工廠還有配套的方法名如handle,predicate,validate
測試類 Test結尾 UserServiceTest, 表示用來測試UserService類的
MVC分層 Controller,Service,ServiceImpl,DAO後綴 UserManageController,UserManageDAO

四,方法

方法命名採用小駝峯的形式,首字小寫,日後的每一個單詞首字母都要大寫。 和類名不一樣的是,方法命名通常爲動詞或動詞短語,與參數或參數名共同組成動賓短語,即動詞 + 名詞。一個好的函數名通常能經過名字直接獲知該函數實現什麼樣的功能。數據庫

4.1 返回真僞值的方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用編程

位置 單詞 意義
Prefix is 對象是否符合期待的狀態 isValid
Prefix can 對象可否執行所期待的動做 canRemove
Prefix should 調用方執行某個命令或方法是好仍是很差,應不該該,或者說推薦仍是不推薦 shouldMigrate
Prefix has 對象是否持有所期待的數據和屬性 hasObservers
Prefix needs 調用方是否須要執行某個命令或方法 needsMigrate

4.2 用來檢查的方法

單詞 意義
ensure 檢查是否爲期待的狀態,不是則拋出異常或返回error code ensureCapacity
validate 檢查是否爲正確的狀態,不是則拋出異常或返回error code validateInputs

4.3 按需求才執行的方法

位置 單詞 意義
Suffix IfNeeded 須要的時候執行,不須要的時候什麼都不作 drawIfNeeded
Prefix might 同上 mightCreate
Prefix try 嘗試執行,失敗時拋出異常或是返回errorcode tryCreate
Suffix OrDefault 嘗試執行,失敗時返回默認值 getOrDefault
Suffix OrElse 嘗試執行、失敗時返回實際參數中指定的值 getOrElse
Prefix force 強制嘗試執行。error拋出異常或是返回值 forceCreate, forceStop

4.4 異步相關方法

位置 單詞 意義
Prefix blocking 線程阻塞方法 blockingGetUser
Suffix InBackground 執行在後臺的線程 doInBackground
Suffix Async 異步方法 sendAsync
Suffix Sync 對應已有異步方法的同步方法 sendSync
Prefix or Alone schedule Job和Task放入隊列 schedule, scheduleJob
Prefix or Alone post 同上 postJob
Prefix or Alone execute 執行異步方法(注:我通常拿這個作同步方法名) execute, executeTask
Prefix or Alone start 同上 start, startJob
Prefix or Alone cancel 中止異步方法 cancel, cancelJob
Prefix or Alone stop 同上 stop, stopJob

4.5 回調方法

位置 單詞 意義
Prefix on 事件發生時執行 onCompleted
Prefix before 事件發生前執行 beforeUpdate
Prefix pre 同上 preUpdate
Prefix will 同上 willUpdate
Prefix after 事件發生後執行 afterUpdate
Prefix post 同上 postUpdate
Prefix did 同上 didUpdate
Prefix should 確認事件是否能夠發生時執行 shouldUpdate

4.6 操做對象生命週期的方法

單詞 意義
initialize 初始化。也可做爲延遲初始化使用 initialize
pause 暫停 onPause ,pause
stop 中止 onStop,stop
abandon 銷燬的替代 abandon
destroy 同上 destroy
dispose 同上 dispose

4.7 與集合操做相關的方法

單詞 意義
contains 是否持有與指定對象相同的對象 contains
add 添加 addJob
append 添加 appendJob
insert 插入到下標n insertJob
put 添加與key對應的元素 putJob
remove 移除元素 removeJob
enqueue 添加到隊列的最末位 enqueueJob
dequeue 從隊列中頭部取出並移除 dequeueJob
push 添加到棧頭 pushJob
pop 從棧頭取出並移除 popJob
peek 從棧頭取出但不移除 peekJob
find 尋找符合條件的某物 findById

4.8 與數據相關的方法

單詞 意義
create 新建立 createAccount
new 新建立 newAccount
from 從既有的某物新建,或是從其餘的數據新建 fromConfig
to 轉換 toString
update 更新既有某物 updateAccount
load 讀取 loadAccount
fetch 遠程讀取 fetchAccount
delete 刪除 deleteAccount
remove 刪除 removeAccount
save 保存 saveAccount
store 保存 storeAccount
commit 保存 commitChange
apply 保存或應用 applyChange
clear 清除數據或是恢復到初始狀態 clearAll
reset 清除數據或是恢復到初始狀態 resetAll

4.9 成對出現的動詞

單詞 意義
get獲取 set 設置
add 增長 remove 刪除
create 建立 destory 移除
start 啓動 stop 中止
open 打開 close 關閉
read 讀取 write 寫入
load 載入 save 保存
create 建立 destroy 銷燬
begin 開始 end 結束
backup 備份 restore 恢復
import 導入 export 導出
split 分割 merge 合併
inject 注入 extract 提取
attach 附着 detach 脫離
bind 綁定 separate 分離
view 查看 browse 瀏覽
edit 編輯 modify 修改
select 選取 mark 標記
copy 複製 paste 粘貼
undo 撤銷 redo 重作
insert 插入 delete 移除
add 加入 append 添加
clean 清理 clear 清除
index 索引 sort 排序
find 查找 search 搜索
increase 增長 decrease 減小
play 播放 pause 暫停
launch 啓動 run 運行
compile 編譯 execute 執行
debug 調試 trace 跟蹤
observe 觀察 listen 監聽
build 構建 publish 發佈
input 輸入 output 輸出
encode 編碼 decode 解碼
encrypt 加密 decrypt 解密
compress 壓縮 decompress 解壓縮
pack 打包 unpack 解包
parse 解析 emit 生成
connect 鏈接 disconnect 斷開
send 發送 receive 接收
download 下載 upload 上傳
refresh 刷新 synchronize 同步
update 更新 revert 復原
lock 鎖定 unlock 解鎖
check out 簽出 check in 簽入
submit 提交 commit 交付
push 推 pull 拉
expand 展開 collapse 摺疊
begin 起始 end 結束
start 開始 finish 完成
enter 進入 exit 退出
abort 放棄 quit 離開
obsolete 廢棄 depreciate 廢舊
collect 收集 aggregate 彙集

五,變量&常量命名

5.1 變量命名

變量是指在程序運行中能夠改變其值的量,包括成員變量和局部變量。變量名由多單詞組成時,第一個單詞的首字母小寫,其後單詞的首字母大寫,俗稱駱駝式命名法(也稱駝峯命名法),如 computedValues,index、變量命名時,儘可能簡短且能清楚的表達變量的做用,命名體現具體的業務含義便可。json

變量名不該如下劃線或美圓符號開頭,儘管這在語法上是容許的。變量名應簡短且富於描述。變量名的選用應該易於記憶,即,可以指出其用途。儘可能避免單個字符的變量名,除非是一次性的臨時變量。pojo中的布爾變量,都不要加is(數據庫中的布爾字段全都要加 is_ 前綴)。

5.2 常量命名

常量命名CONSTANT_CASE,通常採用所有大寫(做爲方法參數時除外),單詞間用下劃線分割。那麼什麼是常量呢?

常量是在做用域內保持不變的值,通常使用final進行修飾。通常分爲三種,全局常量(public static final修飾),類內常量(private static final 修飾)以及局部常量(方法內,或者參數中的常量),局部常量比較特殊,一般採用小駝峯命名便可。

/**
 * 一個demo
 *
 * @author Jann Lee
 * @date 2019-12-07 00:25
 **/
public class HelloWorld {

    /**
     * 局部常量(正例)
     */
    public static final long USER_MESSAGE_CACHE_EXPIRE_TIME = 3600;
    
      /**
     * 局部常量(反例,命名不清晰)
     */
    public static final long MESSAGE_CACHE_TIME = 3600;
    
    /**
     * 全局常量
     */
    private static final String ERROR_MESSAGE = " error message";

    /**
     * 成員變量
     */
    private int currentUserId;

    /**
     * 控制檯打印 {@code message} 信息
     * 
     * @param message 消息體,局部常量
     */
    public void sayHello(final String message){
        System.out.println("Hello world!");
    }

}

常量通常都有本身的業務含義,不要懼怕長度過長而進行省略或者縮寫。如,用戶消息緩存過時時間的表示,那種方式更佳清晰,交給你來評判。

通用命名規則

  1. 儘可能不要使用拼音;杜絕拼音和英文混用。對於一些通用的表示或者難以用英文描述的能夠採用拼音,一旦採用拼音就堅定不能和英文混用。 正例: BeiJing, HangZhou 反例: validateCanShu
  2. 命名過程當中儘可能不要出現特殊的字符,常量除外。
  3. 儘可能不要和jdk或者框架中已存在的類重名,也不能使用java中的關鍵字命名。
  4. 妙用介詞,如for(能夠用同音的4代替), to(可用同音的2代替), from, with,of等。 如類名採用User4RedisDO,方法名getUserInfoFromRedis,convertJson2Map等。

六,代碼註解

6.1 註解的原則

好的命名增長代碼閱讀性,代碼的命名每每有嚴格的限制。而註解不一樣,程序員每每能夠自由發揮,單並不意味着能夠隨心所欲之胡做非爲。優雅的註解一般要知足三要素。

  1. Nothing is strange 沒有註解的代碼對於閱讀者很是不友好,哪怕代碼寫的在清除,閱讀者至少從心理上會有抵觸,更況且代碼中每每有許多複雜的邏輯,因此必定要寫註解,不只要記錄代碼的邏輯,還有說清楚修改的邏輯。
  2. Less is more 從代碼維護角度來說,代碼中的註解必定是精華中的精華。合理清晰的命名能讓代碼易於理解,對於邏輯簡單且命名規範,可以清楚表達代碼功能的代碼不須要註解。濫用註解會增長額外的負擔,更況且大部分都是廢話。
// 根據id獲取信息【廢話註解】
getMessageById(id)
  1. Advance with the time 註解應該隨着代碼的變更而改變,註解表達的信息要與代碼中徹底一致。一般狀況下修改代碼後必定要修改註解。

6.2 註解格式

註解大致上能夠分爲兩種,一種是javadoc註解,另外一種是簡單註解。javadoc註解能夠生成JavaAPI爲外部用戶提供有效的支持javadoc註解一般在使用IDEA,或者Eclipse等開發工具時均可以自動生成,也支持自定義的註解模板,僅須要對對應的字段進行解釋。參與同一項目開發的同窗,儘可能設置成相同的註解模板。

a. 包註解

包註解在工做中每每比較特殊,經過包註解能夠快速知悉當前包下代碼是用來實現哪些功能,強烈建議工做中加上,尤爲是對於一些比較複雜的包,包註解通常在包的根目錄下,名稱統一爲package-info.java。

/**
 * 落地也質量檢測
 * 1. 用來解決什麼問題
 * 對廣告主投放的廣告落地頁進行性能檢測,模擬不一樣的系統,如Android,IOS等; 模擬不一樣的網絡:2G,3G,4G,wifi等
 *
 * 2. 如何實現
 * 基於chrome瀏覽器,用chromedriver驅動瀏覽器,設置對應的網絡,OS參數,獲取到瀏覽器返回結果。
 *
 * 注意: 網絡環境配置信息{@link cn.mycookies.landingpagecheck.meta.NetWorkSpeedEnum}目前使用是常規速度,能夠根據實際狀況進行調整
 * 
 * @author cruder
 * @time 2019/12/7 20:3 下午
 */
package cn.mycookies.landingpagecheck;

b. 類注接

javadoc註解中,每一個類都必須有註解。

/**
* Copyright (C), 2019-2020, Jann  balabala...
*
* 類的介紹:這是一個用來作什麼事情的類,有哪些功能,用到的技術.....
*
* @author   類建立者姓名 保持對齊
* @date     建立日期 保持對齊
* @version  版本號 保持對齊
*/

c. 屬性註解

在每一個屬性前面必須加上屬性註釋,一般有一下兩種形式,至於怎麼選擇,你高興就好,不過一個項目中要保持統一。

/** 提示信息 */
private String userName;
/**
 * 密碼
 */
private String password;

d. 方法註釋

在每一個方法前面必須加上方法註釋,對於方法中的每一個參數,以及返回值都要有說明。

/**
  * 方法的詳細說明,能幹嗎,怎麼實現的,注意事項...
  *
  * @param xxx 	 參數1的使用說明, 可否爲null
  * @return 返回結果的說明, 不一樣狀況下會返回怎樣的結果
  * @throws 異常類型   註明今後類方法中拋出異常的說明
  */

e. 構造方法註釋

在每一個構造方法前面必須加上註釋,註釋模板以下:

/**
  * 構造方法的詳細說明
  *
  * @param xxx 	 參數1的使用說明, 可否爲null
  * @throws 異常類型   註明今後類方法中拋出異常的說明
  */

而簡單註解每每是須要工程師字節定義,在使用註解時應該注意一下幾點:

  1. 枚舉類的各個屬性值都要使用註解,枚舉能夠理解爲是常量,一般不會發生改變,一般會被在多個地方引用,對枚舉的修改和添加屬性一般會帶來很大的影響。
  2. 保持排版整潔,不要使用行尾註釋;雙斜槓和星號以後要用1個空格分隔。
int id = 1;// 反例:不要使用行尾註釋
//反例:換行符與註釋之間沒有縮進
int age = 18;
// 正例:姓名
String name;
/**
 * 1. 多行註釋
 * 
 * 2. 對於不一樣的邏輯說明,能夠用空行分隔
 */

總結

不管是命名和註解,他們的目的都是爲了讓代碼和工程師進行對話,加強代碼的可讀性,可維護性。優秀的代碼每每可以見名知意,註解每每是對命名的補充和完善。命名太南了! 參考文獻:

《碼出高效》

https://www.cnblogs.com/wangcp-2014/p/10215620.html

https://qiita.com/KeithYokoma/items/2193cf79ba76563e3db6

https://google.github.io/styleguide/javaguide.html#s2.1-file-name

若是你想要在技術上有所成就,想要結識志同道合的朋友,能夠關注筆者的wx公衆號 cruder,你們一塊兒進步

原文出處:https://www.cnblogs.com/liqiangchn/p/12000361.html

相關文章
相關標籤/搜索