術(shù)語說明
在文檔中,除非另有說明:
術(shù)語 class 可表示一個普通類,枚舉類搔体,接口或是annotation類型(@interface)
術(shù)語 comment 只用來指代實現(xiàn)的注釋(implementation comments),我們不使用”documentation comments”一詞,而是用 Javadoc曹动。其他的術(shù)語說明會偶爾在后面的文檔出現(xiàn)。
源文件基礎(chǔ)
文件名
源文件以其最頂層的類名來命名牲览,大小寫敏感墓陈,文件擴展名為.java
文件編碼
所有格式統(tǒng)一為UTF-8
特殊字符
空白字符
除了行結(jié)束符序列,ASCII水平空格字符(0×20第献,即空格)是源文件中唯一允許出現(xiàn)的空白字符贡必,這意味著:
所有其它字符串中的空白字符都要進行轉(zhuǎn)義。
制表符不用于縮進(可以在IDE中Tab鍵設(shè)置為若干個空格)庸毫。
特殊轉(zhuǎn)義序列
除了行結(jié)束序列仔拟,ASCII水平空格字符(0x20)是源文件中唯一允許出現(xiàn)的空白字符。就是說其他字符都要進行轉(zhuǎn)義飒赃。
特殊轉(zhuǎn)義序列
對于具有特殊轉(zhuǎn)義序列的字符(\b,\f,\n等)不能使用相應(yīng)8進制或Unicode轉(zhuǎn)義利花。
非ASCII字符
對于剩余的非ASCII字符科侈,是使用實際的Unicode字符還是使用等價的轉(zhuǎn)義符(\u221e)取決于那個更利于閱讀和理解。
源文件結(jié)構(gòu)
一個源文件應(yīng)包含(按順序):
許可證版權(quán)信息(如有需要)
prckage 語句
import 語句
頂級類(以上每個須用空行隔開)
import中不使用通配符
如:import java.util.*;
import語句不換行
類聲明
只有一個頂級類
類聲明每個頂級類都在一個與它同名的源文件中(當(dāng)然炒事,還包含.java后綴)臀栈。
類成員順序
每個類應(yīng)該以某種邏輯去排序它的成員,維護者應(yīng)該要能解釋這種排序邏輯羡洛。比如挂脑, 新的方法不能總是習(xí)慣性地添加到類的結(jié)尾,因為這樣就是按時間順序而非某種邏輯來排序的欲侮。
區(qū)塊劃分
建議用注釋將源文件分為明顯的區(qū)塊崭闲,區(qū)塊劃分如下:
常量聲明區(qū)
UI控件成員變量聲明區(qū)
內(nèi)部接力聲明區(qū)
初始化相關(guān)方法區(qū)
事件響應(yīng)方法區(qū)
普通邏輯方法區(qū)
重載邏輯方法區(qū)
發(fā)起異步任務(wù)方法區(qū)
異步任務(wù)回調(diào)方法區(qū)
生命周期回調(diào)方法區(qū)(不包含oncreate)
內(nèi)部類聲明區(qū)
類成員排列通用規(guī)則
按照發(fā)生的先后順序排列
常量按照使用先后排列
UI控件成員變量按照layout文件中的先后順序排列
普通成員變量按照使用的先后順序排列
方法基本上都按照調(diào)用的先后順序在各自區(qū)塊中排列
相關(guān)功能作為小區(qū)塊放在一起(或者封裝掉)
重載:永不分離
當(dāng)一個類有多個構(gòu)造函數(shù),或是多個同名方法威蕉,這些函數(shù)/方法應(yīng)該順序的出現(xiàn)在一起刁俭。
格式術(shù)語
說明:塊狀結(jié)構(gòu)指一個類,方法或構(gòu)造函數(shù)主題韧涨。
大括號
使用大括號(即使是可選的)
大括號與if, else, for, do, while語句一起使用牍戚,即使只有一條語句(或是空),也應(yīng)該把大括號寫上虑粥。
空塊:可以用簡潔版本
一個空的塊狀結(jié)構(gòu)里什么也不包含如孝,大括號可以簡潔的寫成{},不需要換行娩贷。例外:如果它是一個多塊語句的一部分(if/else 或 try/catch/finally) 第晰,即使大括號內(nèi)沒內(nèi)容,右大括號也要換行彬祖。
塊縮進:4個空格
當(dāng)增加一個新的塊時茁瘦,縮進增加4個空格,當(dāng)塊結(jié)束時储笑,縮進返回先前縮進級別甜熔。縮進級別適用于代碼和注釋突倍。
一行一個語句
每個語句后要換行
具體結(jié)構(gòu)
每次只聲明一個變量
不要使用組合聲明腔稀,比如int a, b(不強制)
在需要時才聲明,并盡快進行初始化
不要在一個代碼塊的開頭吧局部變量一次性都聲明赘方,而是在第一次使用時再聲明烧颖。并且在聲明后盡快進行初始化。
數(shù)組
數(shù)組初始化可以寫成塊狀結(jié)構(gòu)
比如窄陡,下面的寫法都是OK的:
- new int[] {
0, 1, 2, 3
} - new int[] {
0,
1,
2,
3
} - new int[] {
0, 1,
2, 3
} - new int[]
{0, 1, 2, 3}
非C風(fēng)格的數(shù)組聲明
中括號是類型的一部分:String[] args炕淮, 而非 String args[]。
switch語句
術(shù)語說明:switch塊的大括號內(nèi)是一個或多個語句組跳夭。
每個語句組包含一個或多個switch標(biāo)簽(case FOO:或default:)涂圆,后面跟著一條或多條語句们镜。
縮進
與其它塊狀結(jié)構(gòu)一致,switch塊中的內(nèi)容縮進為2個空格润歉。每個switch標(biāo)簽后新起一行模狭,再縮進2個空格,寫下一條或多條語句踩衩。
default的情況要寫出來
每個switch語句都包含一個default語句組嚼鹉,即使它什么代碼也不包含。
注解
注解緊跟在文檔塊后面驱富,應(yīng)用于類锚赤、方法和構(gòu)造函數(shù),一個注解獨占一行褐鸥。這些換行不屬于自動換行线脚,因此縮進級別不變。
注釋
- 注釋盡量使用javadoc注釋
- 在方法內(nèi)的注釋可以使用//
- 注釋不可使用行尾注釋
Modifiers
類和成員的modifiers如果存在叫榕,則按Java語言規(guī)范中推薦的順序出現(xiàn)浑侥。
public protected private
abstract
static
final
transient
Volatile
synchronized
native
strictfp
命名約定
對所有標(biāo)識符懂通用的規(guī)則
標(biāo)識符只能使用ASCII字母和數(shù)字,因此每個有效的標(biāo)識符名稱都能匹配正則表達式\w+
標(biāo)識符類型的規(guī)則
包名
包名全部小寫晰绎,連續(xù)的單詞只是簡單地連接起來寓落,不使用下劃線。
采用反域名命名規(guī)則荞下,全部使用小寫字母零如。一級包名為com,二級包名為drhb锄弱,三級包名根據(jù)應(yīng)用進行命名,四級包名為模塊名或?qū)蛹壝?br> 包名 此包中包含com.xx.應(yīng)用名稱縮寫
- .activity 頁面用到的Activity類 (activitie層級名用戶界面層)
- .base 基礎(chǔ)共享的類
- .adapter 頁面用到的Adapter類 (適配器的類)
- .util 此包中包含:公共工具方法類(util模塊名)
- .bean 下面可分:vo祸憋、po会宪、dto 此包中包含:JavaBean類
- .model 此包中包含:模型類
- .db 數(shù)據(jù)庫操作類
- .view (或者 com.xx.應(yīng)用名稱縮寫.widget ) 自定義的View類等* .service Service服務(wù)
- .receiver BroadcastReceiver服務(wù)
- 所有M、V蚯窥、P抽取出來的接口都放置在相應(yīng)模塊的i包下掸鹅,所有的實現(xiàn)都放置在相應(yīng)模塊的impl下
類名
類名都以UpperCamelCase風(fēng)格編寫。
類名通常是名詞或名詞短語拦赠,接口名稱有時可能是形容詞或形容詞短語∥∩常現(xiàn)在還沒有特定的規(guī)則或行之有效的約定來命名注解類型。
名詞荷鼠,采用大駝峰命名法句携,盡量避免縮寫,除非該縮寫是眾所周知的允乐, 比如HTML,URL矮嫉,如果類名稱中包含單詞縮寫削咆,則單詞縮寫的每個字母均應(yīng)大寫。
類 描述 例如
- Activity 類 Activity為后綴標(biāo)識 歡迎頁面類WelcomeActivity
- Adapter類 Adapter 為后綴標(biāo)識 新聞詳情適配器 NewDetailAdapter
- 解析類 Parser為后綴標(biāo)識 首頁解析類HomePosterParser
- 工具方法類 Util或Manager為后綴標(biāo)識(與系統(tǒng)或第三方的Utils區(qū)分)或* * 功能+Util
- 線程池管理類:ThreadPoolManager
- 日志工具類:LogUtil(Logger也可)
- 打印工具類:PrinterUtil
- 數(shù)據(jù)庫類 以DBHelper后綴標(biāo)識 新聞* 數(shù)據(jù)庫:NewDBHelper
- Service類 以Service為后綴標(biāo)識
- 時間服務(wù)TimeServiceBroadcast
- Receiver類 以Receiver為后綴標(biāo)識
- 推送接收J(rèn)PushReceiver
- ContentProvider 以Provider為后綴標(biāo)識
- 自定義的共享基礎(chǔ)類 以Base開頭 BaseActivity,BaseFragment
- 測試類的命名以它要測試的類的名稱開始蠢笋,以Test結(jié)束拨齐。
- 接口(interface):命名規(guī)則與類一樣采用大駝峰命名法,多以able或ible結(jié)尾
- 所有Model昨寞、View瞻惋、Presenter的接口都以I為前綴,不加后綴援岩,其他的接口采用上述命名規(guī)則歼狼。
方法名
方法名都以 LowerCamelCase 風(fēng)格編寫。
方法名通常是動詞或動詞短語窄俏。
方法 說明
- initXX() 初始化相關(guān)方法,使用init為前綴標(biāo)識蹂匹,如初始化布局initView()
- isXX() checkXX() 方法返回值為
- boolean型的請使用is或check為前綴標(biāo)識
- getXX() 返回某個值的方法,使用get為前綴標(biāo)識
- handleXX() 對數(shù)據(jù)進行處理的方法凹蜈,盡量使用handle為前綴標(biāo)識
- displayXX()/showXX() 彈出提示框和提示信息限寞,使用display/show為前綴標(biāo)識
- saveXX() 與保存數(shù)據(jù)相關(guān)的,使用save為前綴標(biāo)識
- resetXX() 對數(shù)據(jù)重組的仰坦,使用reset前綴標(biāo)識
- clearXX() 清除數(shù)據(jù)相關(guān)的
- removeXXX() 清除數(shù)據(jù)相關(guān)的
- drawXXX() 繪制數(shù)據(jù)或效果相關(guān)的履植,使用draw前綴標(biāo)識
- 下劃線可能出現(xiàn)在JUnit測試方法名稱中用以分隔名稱的邏輯組件。一個典型的模式是:test_悄晃,例如testPop_emptyStack玫霎。
并不存在唯一正確的方式來命名測試方法。
常量名
常量名命名模式為CONSTANT_CASE妈橄,全部字母大寫庶近,用下劃線分隔單詞。那眷蚓,到底什么算是一個常量鼻种?
每個常量都是一個靜態(tài)final字段,但不是所有靜態(tài)final字段都是常量沙热。在決定一個字段是否是一個常量時叉钥,考慮它是否真的感覺像是一個常量。
例如篙贸,如果任何一個該實例的觀測狀態(tài)是可變的投队,則它幾乎肯定不會是一個常量。只是永遠不打算改變對象一般是不夠的爵川,它要真的一直不變才能將它示為常量敷鸦。
這些名字通常是名詞或名詞短語。
非常量字段名
非常量字段名以LowerCamelCase風(fēng)格的基礎(chǔ)上改造為如下風(fēng)格:
基本結(jié)構(gòu)為scopeVariableNameType,
- scope:范圍
- 非公有轧膘,非靜態(tài)字段命名以m開頭钞螟。
- 靜態(tài)字段命名以s開頭。
- 公有非靜態(tài)字段命名以p開頭谎碍。
- 公有靜態(tài)字段(全局變量)命名以g開頭鳞滨。
- public static final 字段(常量) 全部大寫,并用下劃線連起來蟆淀。
使用1字符前綴來表示作用范圍拯啦,1個字符的前綴必須小寫,前綴后面是由表意性強的一個單詞或多個單詞組成的名字熔任,而且每個單詞的首寫字母大寫褒链,其它字母小寫,這樣保證了對變量名能夠進行正確的斷句疑苔。
Type:類型
考慮到Android中使用很多UI控件甫匹,為避免控件和普通成員變量混淆以及更好達意,所有用來表示控件的成員變量統(tǒng)一加上控件縮寫作為后綴(文末附有縮寫表)惦费。
對于普通變量一般不添加類型后綴兵迅,如果統(tǒng)一添加類型后綴,請參考文末的縮寫表薪贫。
用統(tǒng)一的量詞通過在結(jié)尾處放置一個量詞恍箭,就可創(chuàng)建更加統(tǒng)一的變量,它們更容易理解瞧省,也更容易搜索扯夭。
注意:如果項目中使用ButterKnife,則不添加m前綴鞍匾,以LowerCamelCase風(fēng)格命名交洗。
例如,請使用 mCustomerStrFirst 和 mCustomerStrLast橡淑,而不要使用mFirstCustomerStr和mLastCustomerStr藕筋。
量詞列表:量詞后綴說明
First 一組變量中的第一個
Last 一組變量中的最后一個
Next 一組變量中的下一個變量
Prev 一組變量中的上一個
Cur 一組變量中的當(dāng)前變量。
說明:
集合添加如下后綴:List梳码、Map、Set
數(shù)組添加如下后綴:Arr
參數(shù)名
參數(shù)名以LowerCamelCase風(fēng)格編寫
局部變量名
局部變量名以LowerCamelCase風(fēng)格編寫掰茶,比起其它類型的名稱,局部變量名可以有更為寬松的縮寫蜜笤。
雖然縮寫更寬松濒蒋,但還是要避免用單字符進行命名沪伙,除了臨時變量和循環(huán)變量暖混。
即使局部變量是final和不可改變的拣播,也不應(yīng)該把它示為常量贮配,自然也不能用常量的規(guī)則去命名它泪勒。
臨時變量
臨時變量通常被取名為
- i圆存,j,k,m和n撞羽,它們一般用于整型诀紊;
- c,d碌宴,e贰镣,它們一般用于字符型恭陡。 如: for (int i = 0; i < len ; i++),并且它和第一個單詞間沒有空格。
資源文件命名規(guī)范
資源布局文件(XML文件(layout布局文件))
全部小寫,采用下劃線命名法
- contentview 命名
必須以全部單詞小寫孕惜,單詞間以下劃線分割削罩,使用名詞或名詞詞組进陡。
所有Activity或Fragment的contentView必須與其類名對應(yīng)以蕴,對應(yīng)規(guī)則為:
將所有字母都轉(zhuǎn)為小寫喳资,將類型和功能調(diào)換(也就是后綴變前綴)伴鳖。
例如:activity_main.xml - Dialog命名:dialog_描述.xml
例如:dialog_hint.xml - PopupWindow命名:ppw_描述.xml
例如:ppw_info.xml - 列表項命名:item_描述.xml
例如:item_city.xml - 包含項命名:模塊(位置)描述.xml
例如:activity_main_head.xml匿乃、activity_main_bottom.xml
注意:通用的包含項命名采用:項目名稱縮寫描述.xml
例如:xxxx_title.xml
資源文件
全部小寫幢炸,采用下劃線命名法,加前綴區(qū)分
命名模式:可加后綴 small 表示小圖, big 表示大圖闸天,邏輯名稱可由多個單詞加下劃線組成笼吟,采用以下規(guī)則:
用途模塊名邏輯名稱
用途模塊名顏色
用途邏輯名稱
用途顏色
說明:用途也指控件類型(具體見UI控件縮寫表)
例如:
btn_main_home.png 按鍵
divider_maket_white.png 分割線
ic_edit.png 圖標(biāo)
bg_main.png 背景
btn_red.png 紅色按鍵
btn_red_big.png 紅色大按鍵
ic_head_small.png 小頭像
bg_input.png 輸入框背景
divider_white.png 白色分割線
如果有多種形態(tài)如按鈕等除外如 btn_xx.xml(selector)
名稱 功能
btn_xx 按鈕圖片使用btn_整體效果(selector)
btn_xx_normal 按鈕圖片使用btn_正常情況效果
btn_xx_pressed 按鈕圖片使用btn_點擊時候效果
btn_xx_focused state_focused聚焦效果
btn_xx_disabled state_enabled (false)不可用效果
btn_xx_checked state_checked選中效果
btn_xx_selected state_selected選中效果
btn_xx_hovered state_hovered懸停效果
btn_xx_checkable state_checkable可選效果
btn_xx_activated state_activated激活的
btn_xx_windowfocused state_window_focused
bg_head 背景圖片使用bg_功能說明
def_search_cell 默認(rèn)圖片使用def功能說明
ic_more_help 圖標(biāo)圖片使用ic功能說明
seg_list_line 具有分隔特征的圖片使用seg功能說明
sel_ok 選擇圖標(biāo)使用sel功能_說明
動畫文件(anim文件夾下)
全部小寫诲侮,采用下劃線命名法沟绪,加前綴區(qū)分。
具體動畫采用以下規(guī)則:
模塊名_邏輯名稱
邏輯名稱
refresh_progress.xml
market_cart_add.xml
market_cart_remove.xml
普通的tween動畫采用如下表格中的命名方式
// 前面為動畫的類型,后面為方向
動畫命名例子 規(guī)范寫法
fade_in 淡入
fade_out 淡出
push_down_in 從下方推入
push_down_out 從下方推出
push_left 推向左方
slide_in_from_top 從頭部滑動進入
zoom_enter 變形進入
slide_in 滑動進入
shrink_to_middle 中間縮小
- values中name命名
類別 命名 示例
strings strings的name命名使用下劃線命名法,采用以下規(guī)則:模塊名+邏輯名稱 main_menu_about 主菜單按鍵文字friend_title 好友模塊標(biāo)題欄friend_dialog_del 好友刪除提示login_check_email 登錄驗證
dialog_title 彈出框標(biāo)題
button_ok 確認(rèn)鍵 loading 加載文字
colors colors的name命名使用下劃線命名法裹虫,采用以下規(guī)則:模塊名+邏輯名稱 顏色 friend_info_bg friend_bg transparent gray
styles styles的name命名使用 Camel命名法,采用以下規(guī)則:模塊名+邏輯名稱 main_tabBottom
layout中的id命名
命名模式為:view縮寫_view的邏輯名稱
使用 AndroidStudio 的插件 ButterKnife Zelezny,生成注解非常方便。
如果不使用 ButterKnife Zelezny,則建議使用 view 縮寫做前綴綴,如:tv_username(展示用戶名的TextView)
編程實踐
@Override:能用則用
只要是合法的杯瞻,就把@Override注解給用上镐牺。
捕獲的異常:不能忽視
除了下面的例子,對捕獲的異常不做響應(yīng)是極少正確的魁莉。(典型的響應(yīng)方式是打印日志睬涧,或者如果它被認(rèn)為是不可能的,則把它當(dāng)作一個 AssertionError 重新拋出旗唁。)
如果它確實是不需要在catch塊中做任何響應(yīng)畦浓,需要做注釋加以說明(如下面的例子)。
try {
int i = Integer.parseInt(response);
return handleNumericResponse();
} catch (NumberFormatException ok){
// it's not numeric; that's fine, just continue
}
return handleTextResponse(response);
例外:在測試中检疫,如果一個捕獲的異常被命名為expected讶请,則它可以被不加注釋地忽略。下面是一種非常常見的情形屎媳,用以確保所測試的方法會拋出一個期望中的異常夺溢,因此在這里就沒有必要加注釋。
try {
emptyStack.pop();
fail();
} catch (NoSuchElementException expected) {
}
靜態(tài)成員:使用類進行調(diào)用
使用類名調(diào)用靜態(tài)的類成員烛谊,而不是具體某個對象或表達式风响。
Foo aFoo = ...;
Foo.aStaticMethod(); // good
aFoo.aStaticMethod(); // bad
somethingThatYieldsAFoo().aStaticMethod(); // very bad
注釋Javadoc
格式
一般形式
Javadoc塊的基本格式如下所示:
/**
* Multiple lines of Javadoc text are written here,
* wrapped normally...
*/
public int method(String p1) { ... }
或者是以下單行形式:
/** An especially shortbit of Javadoc. */
基本格式總是OK的。當(dāng)整個Javadoc塊能容納于一行時,且沒有Javadoc標(biāo)可以使用單行形式丹禀。
段落
空行(即状勤,只包含最左側(cè)星號的行)會出現(xiàn)在段落之間和Javadoc標(biāo)記(@XXX)之前(如果有的話)。
除了第一個段落湃崩,每個段落第一個單詞前都有標(biāo)簽
荧降,并且它和第一個單詞間沒有空格。
Javadoc標(biāo)記
標(biāo)準(zhǔn)的Javadoc標(biāo)記按以下順序出現(xiàn):@param, @return, @throws, @deprecated,
前面這4種標(biāo)記如果出現(xiàn)攒读,描述都不能為空朵诫。 當(dāng)描述無法在一行中容納,連續(xù)行需要至少再縮進4個空格薄扁。