本文同步發表於個人微信公衆號,微信搜索 nanchen 便可關注java
雖然咱們項目的代碼時間並不長,也沒通過太多人手,但代碼的規範性依然堪憂,目前存在較多的比較自由的「代碼規範」,這很是不利於項目的維護,代碼可讀性也不夠高,android
此外,客戶端和後端的研發模式也徹底不一樣,後端研發基本都是基於 SOA 思想的,一般一個子系統 3 我的一塊兒維護就已是很充分的人力了,更多時候就是 1 個主力 + 1 個 backup 的人力配置。git
而客戶端卻徹底不一樣,你們的代碼都是相互交叉的,一個模塊的代碼可能要經歷數十人的蹂躪,因此造成一個一致的開發規範迫在眉睫。github
核心仍是減小溝通成本,提高咱們的 Code Review 效率,讓咱們的代碼更加易於維護。此外,一個一致的代碼規範能夠形成更少的 bug,也就意味着更節省時間和金錢。數據庫
固然,規範是約定的,本系列文字全是筆者多年來博採衆長,積累而成,因此有任何不一樣意見,歡迎評論拍磚。後端
工欲善其事,必先利其器。微信
因爲 Android 基本都基於 Android Studio 進行開發,因此工具規範所有以 Android Studio 爲前提。markdown
4. 編輯完 .java、.kt、.xml 等文件後必須格式化(須要在設置好如下幾點的前提下)app
Reformat Code 的必要性,必定須要保證 IDE 配置一致爲前提,儘量貼切於 Android Studio 默認。框架
強烈建議對於比較長的老代碼局部格式化,不全局格式化
kotlinx.android.synthetic.main
除外。以上幾處設置完畢,其餘採用 Android Studio 默認方式,再進行 Reformat Code 快捷鍵便可。
前面強調了工具的統一配置,再利用 Android Studio 自己的功能即可把代碼風格變得一致。接下來就帶來第二部分:Android 的分包規範。
對於分包,咱們須要達成一致,咱們採用 PBF 方式,不推薦使用 PBL 方式。
PBF(按功能分包 Package By Feature) PBL(按層分包 Package By Layer)
PBF 可能不是很好區分在哪一個功能中,不過也比 PBL 要好找不少,且 PBF 與 PBL 相比較有以下優點:
哪塊要添新功能,只改某一個 package 下的東西,而PBL 須要改多個 package,很是麻煩。
原則上一個 package 下的不容許其餘類訪問都是不該該加上 public 的。
統計發現新功能沒人用,這個版本那塊功能得去掉。若是是 PBL,得從功能入口到整個業務流程把受到牽連的全部能刪的代碼和 class 都揪出來刪掉,一不當心就完蛋。若是是 PBF,好說,先刪掉對應包,再刪掉功能入口(刪掉包後入口確定報錯了),完事。
解決問題的通常方法是從抽象到具體,PBF 包名是對功能模塊的抽象,包內的 class 是實現細節,符合從抽象到具體,而 PBL 弄反了。PBF 從肯定 AppName 開始,根據功能模塊劃分 package,再考慮每塊的具體實現細節,而 PBL 從一開始就要考慮要不要 dao 層,要不要 com 層等等。
PBL 既分離 class 又分離 package,而 PBF 只經過 class 來分離邏輯代碼。
PBL 中包的大小無限增加是合理的,由於功能越添越多,而 PBF 中包太大(包裏 class 太多)表示這塊須要重構(劃分子包)。
代碼中的命名嚴禁使用拼音與英文混合的方式,更不容許直接使用中文的方式。正確的英文拼寫和語法可讓閱讀者易於理解,避免歧義。
注意:即便純拼音命名方式也要避免採用。但國際通用的名稱,可視同英文,好比
toutiao
、douyin
等。
Android 裏面有 package 的概念,因此須要約定一下包名命名規範。
包名所有小寫,不容許出現中文、大寫字母或者下劃線,前面爲子模塊命名,再根據 PBF 方式進行命名。
類名都以 UpperCamelCase
風格編寫。
類名一般是名詞或名詞短語,接口名稱有時多是形容詞或形容詞短語。如今尚未特定的規則或行之有效的約定來命名註解類型。
名詞,採用大駝峯命名法,儘可能避免縮寫,除非該縮寫是衆所周知的, 好比 HTML、URL,若是類名稱中包含單詞縮寫,則單詞縮寫的每一個字母均應大寫。
類 | 描述 | 例如 |
---|---|---|
Activity 類 |
模塊名 + Activity |
閃屏頁類 SplashActivity |
Fragment 類 |
模塊名 + Fragment |
主頁類 HomeFragment |
Service 類 |
模塊名 + Service |
時間服務 TimeService |
BroadcastReceiver 類 |
功能名 + Receiver |
推送接收 JPushReceiver |
ContentProvider 類 |
功能名 + Provider |
ShareProvider |
自定義 View | 功能名 + View/ViewGroup(組件名稱) | ShapeButton |
Dialog對話框 | 功能名+Dialog | ImagePickerDialog |
Adapter 類 |
模塊名 + Adapter |
課程詳情適配器 LessonDetailAdapter |
解析類 | 功能名 + Parser |
首頁解析類 HomePosterParser |
工具方法類 | 功能名 + Utils 或 Manager |
線程池管理類:ThreadPoolManager 日誌工具類: LogUtils (Logger 也可)打印工具類: PrinterUtils |
數據庫類 | 功能名 + DBHelper |
新聞數據庫:NewsDBHelper |
自定義的共享基礎類 | Base + 基礎 |
BaseActivity , BaseFragment |
抽象類 | Base / Abstract 開頭 |
AbstractLogin |
異常類 | Exception 結尾 |
LoginException |
接口 | able / ible 結尾 / I 開頭 |
Runnable , Accessible ,ILoginView |
測試類的命名以它要測試的類的名稱開始,以 Test 結束。例如:HashTest
或 HashIntegrationTest
。
接口(interface):命名規則與類同樣採用大駝峯命名法,多以 able 或 ible 結尾,如 interface Runnable
、interface Accessible
。
注意:若是項目採用 MVP,全部 Model、View、Presenter 的接口都以 I 爲前綴,不加後綴,其餘的接口採用上述命名規則。
方法名都以 lowerCamelCase
風格編寫。
方法名一般是動詞或動詞短語。
方法 | 說明 |
---|---|
initXX() |
初始化相關方法,使用 init 爲前綴標識,如初始化佈局 initView() |
isXX() , checkXX() |
方法返回值爲 boolean 型的請使用 is/check 爲前綴標識 |
getXX() |
返回某個值的方法,使用 get 爲前綴標識 |
setXX() |
設置某個屬性值 |
handleXX() , processXX() |
對數據進行處理的方法 |
displayXX() , showXX() |
彈出提示框和提示信息,使用 display/show 爲前綴標識 |
updateXX() |
更新數據 |
saveXX() , insertXX() |
保存或插入數據 |
resetXX() |
重置數據 |
clearXX() |
清除數據 |
removeXX() , deleteXX() |
移除數據或者視圖等,如 removeView() |
drawXX() |
繪製數據或效果相關的,使用 draw 前綴標識 |
這裏的變量爲廣義的變量,包括了常量、局部變量、全局變量等,它們的基礎規則是:
lowerCamelCase
風格;在具體的變量命名時,會根據該變量的類型不一樣而附加額外的命名規則:
類型 | 說明 | 例如 |
---|---|---|
常量 | 大寫 & 下劃線隔開,Kotlin 必定要 const val | const val TYPE_NORMAL = 1 static final TYPE_NORMAL = 1 |
臨時變量名 | 整型:i 、j 、k 、m 、n ,字符型通常用 c 、d 、e |
for(int i = 0;i < len; i++) |
其餘變量 | lowerCamelCase 風格便可,私有變量也不要使用 m 開頭 |
private int tmp; |
Kotlin | 只讀變量使用 val ,可變變量使用 var ,儘量使用 val |
var tmp = 0 val defaultIndex = 0 |
Android 的資源包括:
資源文件命名爲所有小寫,採用下劃線命名法。
安卓主要包含屬性動畫和視圖動畫,其視圖動畫包括補間動畫和逐幀動畫。屬性動畫文件須要放在 res/animator/
目錄下,視圖動畫文件需放在 res/anim/
目錄下。命名規則:{模塊名_}邏輯名稱
。
說明:
{}
中的內容爲可選,邏輯名稱
可由多個單詞加下劃線組成。例如:refresh_progress.xml
、market_cart_add.xml
、market_cart_remove.xml
。
若是是普通的補間動畫或者屬性動畫,可採用:動畫類型_方向
的命名方式。
例如:
名稱 | 說明 |
---|---|
fade_in |
淡入 |
fade_out |
淡出 |
push_down_in |
從下方推入 |
push_down_out |
從下方推出 |
push_left |
推向左方 |
slide_in_from_top |
從頭部滑動進入 |
zoom_enter |
變形進入 |
slide_in |
滑動進入 |
shrink_to_middle |
中間縮小 |
color/ 是專門用於存放顏色相關資源的文件夾。命名規則:類型{_模塊名}_邏輯名稱
。
說明:
{}
中的內容爲可選。例如:sel_btn_font.xml
。
顏色資源也能夠放於 res/drawable/
目錄,引用時則用 @drawable
來引用,但不推薦這麼作,最好仍是把二者分開。
res/drawable/
目錄下放的是位圖文件(.png、.9.png、.jpg、.gif)或編譯爲可繪製對象資源子類型的 XML 文件,而 res/mipmap/
目錄下放的是不一樣密度的啓動圖標,因此 res/mipmap/
只用於存放啓動圖標,其他圖片資源文件都應該放到 res/drawable/
目錄下。
命名規則:類型{_模塊名}_邏輯名稱
、類型{_模塊名}_顏色
。
說明:
{}
中的內容爲可選;類型
能夠是可繪製對象資源類型,也能夠是控件類型最後可加後綴_small
表示小圖,_big
表示大圖。
例如:
名稱 | 說明 |
---|---|
btn_main_about.png |
主頁關於按鍵 類型_模塊名_邏輯名稱 |
btn_back.png |
返回按鍵 類型_邏輯名稱 |
divider_maket_white.png |
商城白色分割線 類型_模塊名_顏色 |
ic_edit.png |
編輯圖標 類型_邏輯名稱 |
bg_main.png |
主頁背景 類型_邏輯名稱 |
btn_red.png |
紅色按鍵 類型_顏色 |
btn_red_big.png |
紅色大按鍵 類型_顏色 |
ic_avatar_small.png |
小頭像圖標 類型_邏輯名稱 |
bg_input.png |
輸入框背景 類型_邏輯名稱 |
divider_white.png |
白色分割線 類型_顏色 |
bg_main_head.png |
主頁頭部背景 類型_模塊名_邏輯名稱 |
def_search_cell.png |
搜索頁面默認單元圖片 類型_模塊名_邏輯名稱 |
ic_more_help.png |
更多幫助圖標 類型_邏輯名稱 |
divider_list_line.png |
列表分割線 類型_邏輯名稱 |
sel_search_ok.xml |
搜索界面確認選擇器 類型_模塊名_邏輯名稱 |
shape_music_ring.xml |
音樂界面環形形狀 類型_模塊名_邏輯名稱 |
若是有多種形態,如按鈕選擇器:sel_btn_xx.xml
,採用以下命名:
名稱 | 說明 |
---|---|
sel_btn_xx |
做用在 btn_xx 上的 selector |
btn_xx_normal |
默認狀態效果 |
btn_xx_pressed |
state_pressed 點擊效果 |
btn_xx_focused |
state_focused 聚焦效果 |
btn_xx_disabled |
state_enabled 不可用效果 |
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_window_focused |
state_window_focused 窗口聚焦效果 |
注意:使用 Android Studio 的插件 SelectorChapek 能夠快速生成 selector,前提是命名要規範。
命名規則:類型_模塊名
、{模塊名_}類型_邏輯名稱
。(也採用 PBF,方便查看,尤爲在大項目中)
說明:
{}
中的內容爲可選。
例如:
類型 | 名稱 | 說明 |
---|---|---|
Activity |
main_activity.xml |
主窗體 模塊名_類型 |
Fragment |
music_fragment.xml |
音樂片斷 模塊名_類型 |
Dialog |
loading_dialog.xml |
加載對話框 邏輯名稱_類型 |
PopupWindow |
info_ppw.xml |
信息彈窗(PopupWindow) 邏輯名稱_類型 |
adapter 的列表項 |
main_song_item.xml |
主頁歌曲列表項 模塊名_類型_邏輯名稱 |
命名規則:{模塊名_}_邏輯名_view 縮寫(功能)
,例如: main_search_btn
、back_btn
。此外,採用 Kotlinx 直接獲取佈局文件的時候,id 命名採用駝峯樣式。
說明:
{}
中的內容爲可選。參考 GoogleSamples Demo:github.com/android/arc…
例如:
類型 | 規範 | 命名示例 |
---|---|---|
TextView |
xxx_text |
user_login_text |
EditText |
xxx_edit |
user_login_edit |
ImageView |
xxx_iv |
user_login_iv |
Button |
xxx_btn |
user_login_btn |
CheckBox |
xxx_cb |
user_login_cb |
GridView |
xxx_gv |
user_login_gv |
ListView |
xxx_lv |
user_login_lv |
RecyclerView |
xxx_rv |
user_login_rv |
RadioButton |
xxx_rb |
user_login_rb |
LinearLayout |
xxx_ll |
user_login_ll |
RelativeLayout |
xxx_rl |
user_login_rl |
FrameLayout |
xxx_fl |
user_login_fl |
GridLayout |
xxx_gl |
user_login_gl |
ConstraintLayout |
xxx_cl |
user_login_cl |
菜單相關的資源文件應放在該目錄下。命名規則:{模塊名_}邏輯名稱
說明:
{}
中的內容爲可選。例如:main_drawer.xml
、navigation.xml
。
<color>
的 name
命名使用下劃線命名法,在你的 colors.xml
文件中應該只是映射顏色的名稱一個 ARGB 值,而沒有其它的。不要使用它爲不一樣的按鈕來定義 ARGB 值。
例如,不要像下面這樣作:
<resources>
<color name="button_foreground">#FFFFFF</color>
<color name="button_background">#2A91BD</color>
<color name="comment_background_inactive">#5F5F5F</color>
<color name="comment_background_active">#939393</color>
<color name="comment_foreground">#FFFFFF</color>
<color name="comment_foreground_important">#FF9D2F</color>
...
<color name="comment_shadow">#323232</color>
複製代碼
使用這種格式,會很是容易重複定義 ARGB 值,並且若是應用要改變基色的話會很是困難。同時,這些定義是跟一些環境關聯起來的,如 button
或者 comment
,應該放到一個按鈕風格中,而不是在 colors.xml
文件中。
相反,應該這樣作:
<resources>
<!-- grayscale -->
<color name="white" >#FFFFFF</color>
<color name="gray_light">#DBDBDB</color>
<color name="gray" >#939393</color>
<color name="gray_dark" >#5F5F5F</color>
<color name="black" >#323232</color>
<!-- basic colors -->
<color name="green">#27D34D</color>
<color name="blue">#2A91BD</color>
<color name="orange">#FF9D2F</color>
<color name="red">#FF432F</color>
</resources>
複製代碼
嚮應用設計者那裏要這個調色板,名稱不須要跟 "green"
、"blue"
等等相同。"brand_primary"
、"brand_secondary"
、"brand_negative"
這樣的名字也是徹底能夠接受的。像這樣規範的顏色很容易修改或重構,會使應用一共使用了多少種不一樣的顏色變得很是清晰。一般一個具備審美價值的 UI 來講,減小使用顏色的種類是很是重要的。
注意:若是某些顏色和主題有關,那就單獨寫一個
colors_theme.xml
。
<string>
的 name
命名使用下劃線命名法,採用如下規則:{模塊名_}邏輯名稱
,這樣方便同一個界面的全部 string
都放到一塊兒,方便查找。
名稱 | 說明 |
---|---|
main_menu_about |
主菜單按鍵文字 |
friend_title |
好友模塊標題欄 |
friend_dialog_del |
好友刪除提示 |
login_check_email |
登陸驗證 |
dialog_title |
彈出框標題 |
button_ok |
確認鍵 |
loading |
加載文字 |
<style>
的 name
命名使用大駝峯命名法,幾乎每一個項目都須要適當的使用 styles.xml
文件,由於對於一個視圖來講,有一個重複的外觀是很常見的,將全部的外觀細節屬性(colors
、padding
、font
)放在 styles.xml
文件中。 在應用中對於大多數文本內容,最起碼你應該有一個通用的 styles.xml
文件,例如:
<style name="ContentText">
<item name="android:textSize">@dimen/font_normal</item>
<item name="android:textColor">@color/basic_black</item>
</style>
複製代碼
應用到 TextView
中:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/price"
style="@style/ContentText"/>
複製代碼
或許你須要爲按鈕控件作一樣的事情,不要中止在那裏,將一組相關的和重複 android:xxxx
的屬性放到一個通用的 <style>
中。
每一個類完成後應該有做者姓名和聯繫方式的註釋,對本身的代碼負責。
/** * <pre> * author : nanchen * e-mail : xxx@xx * time : 2021/01/18 * desc : xxxx 描述 * version: 1.0 * </pre> */
public class WelcomeActivity {
...
}
複製代碼
具體能夠在 AS 中本身配製,進入 Settings -> Editor -> File and Code Templates -> Includes -> File Header,輸入
/** * <pre> * author : ${USER} * e-mail : xxx@xx * time : ${YEAR}/${MONTH}/${DAY} * desc : * version: 1.0 * </pre> */
複製代碼
這樣即可在每次新建類的時候自動加上該頭註釋。
每個成員方法(包括自定義成員方法、覆蓋方法、屬性方法)的方法頭都必須作方法頭註釋,在方法前一行輸入 /** + 回車
或者設置 Fix doc comment
(Settings -> Keymap -> Fix doc comment)快捷鍵,AS 便會幫你生成模板,咱們只須要補全參數便可,以下所示。@param
, @return
, @throws
, @deprecated
這 4 種標記出現的時候,描述都不能爲空。當描述沒法在一行中容納,連續行至少須要再縮進 4 個空格。
/** * Report an accessibility action to this view's parents for delegated processing. * * <p>Implementations of {@link #performAccessibilityAction(int, Bundle)} may internally * call this method to delegate an accessibility action to a supporting parent. If the parent * returns true from its * {@link ViewParent#onNestedPrePerformAccessibilityAction(View, int, android.os.Bundle)} * method this method will return true to signify that the action was consumed.</p> * * <p>This method is useful for implementing nested scrolling child views. If * {@link #isNestedScrollingEnabled()} returns true and the action is a scrolling action * a custom view implementation may invoke this method to allow a parent to consume the * scroll first. If this method returns true the custom view should skip its own scrolling * behavior.</p> * * @param action Accessibility action to delegate * @param arguments Optional action arguments * @return true if the action was consumed by a parent */
public boolean dispatchNestedPrePerformAccessibilityAction(int action, Bundle arguments) {
for (ViewParent p = getParent(); p != null; p = p.getParent()) {
if (p.onNestedPrePerformAccessibilityAction(this, action, arguments)) {
return true;
}
}
return false;
}
複製代碼
塊註釋與其周圍的代碼在同一縮進級別。它們能夠是 /* ... */
風格,也能夠是 // ...
風格(//
後最好帶一個空格)。對於多行的 /* ... */
註釋,後續行必須從 *
開始, 而且與前一行的 *
對齊。如下示例註釋都是 OK 的。
/* * This is okay. */
// And so
// is this.
/* Or you can * even do this. */
複製代碼
註釋不要封閉在由星號或其它字符繪製的框架裏。
Tip:在寫多行註釋時,若是你但願在必要時能從新換行(即註釋像段落風格同樣),那麼使用
/* ... */
。
好比:
全局變量的註釋樣式以下(注意註釋之間有空格):
/** * The next available accessibility id. */
private static int nextAccessibilityViewId;
/** * The animation currently associated with this view. */
protected Animation currentAnimation = null;
複製代碼
AS 已幫你集成了一些註釋模板,咱們只須要直接使用便可,在代碼中輸入 TODO
、FIXME
等這些註釋模板,回車後便會出現以下注釋。
// TODO: 17/3/14 須要實現,但目前還未實現的功能的說明
// FIXME: 17/3/14 須要修正,甚至代碼是錯誤的,不能工做,須要修復的說明
複製代碼
好比 Item getItem(int index)
是一段自說明的代碼,咱們能夠直接從方法的命名就能知道它是幹嗎的,因此不須要增長註釋。
左大括號不單獨佔一行,與其前面的代碼位於同一行:
class MyClass {
int func() {
if (something) {
// ...
} else if (somethingElse) {
// ...
} else {
// ...
}
}
}
複製代碼
咱們須要在條件語句周圍添加大括號。例外狀況:若是整個條件語句(條件和主體)適合放在同一行,那麼您能夠(但不是必須)將其所有放在一行上。例如,咱們接受如下樣式:
if (condition) {
body();
}
複製代碼
一樣也接受如下樣式:
if (condition) body();
複製代碼
但不接受如下樣式:
if (condition)
body(); // bad!
複製代碼
在可行的狀況下,儘可能編寫短小精煉的方法。咱們瞭解,有些狀況下較長的方法是恰當的,所以對方法的代碼長度沒有作出硬性限制。若是某個方法的代碼超出 40 行,請考慮是否能夠在不破壞程序結構的前提下對其拆解。
這並無惟一的正確解決方案,但若是都使用一致的順序將會提升代碼的可讀性,推薦使用以下排序:
例如:
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
private String mTitle;
private TextView mTextViewTitle;
@Override
public void onCreate() {
...
}
public void setTitle(String title) {
mTitle = title;
}
private void setUpView() {
...
}
static class AnInnerClass {
}
}
複製代碼
若是類繼承於 Android 組件(例如 Activity
或 Fragment
),那麼把重寫函數按照他們的生命週期進行排序是一個很是好的習慣,例如,Activity
實現了 onCreate()
、onDestroy()
、onPause()
、onResume()
,它的正確排序以下所示:
public class MainActivity extends Activity {
//Order matches Activity lifecycle
@Override
public void onCreate() {}
@Override
public void onResume() {}
@Override
public void onPause() {}
@Override
public void onDestroy() {}
}
複製代碼
在 Android 開發過程當中,Context
在函數參數中是再常見不過的了,咱們最好把 Context
做爲其第一個參數。
正相反,咱們把回調接口應該做爲其最後一個參數。
例如:
// Context always goes first
public User loadUser(Context context, int userId);
// Callbacks always go last
public void loadUserAsync(Context context, int userId, UserCallback callback);
複製代碼
Android SDK 中的不少類都用到了鍵值對函數,好比 SharedPreferences
、Bundle
、Intent
,因此,即使是一個小應用,咱們最終也不得不編寫大量的字符串常量。
當時用到這些類的時候,咱們 必須 將它們的鍵定義爲 static final
字段,並遵循如下指示做爲前綴。
類 | 字段名前綴 |
---|---|
SharedPreferences | PREF_ |
Bundle | BUNDLE_ |
Fragment Arguments | ARGUMENT_ |
Intent Extra | EXTRA_ |
Intent Action | ACTION_ |
說明:雖然 Fragment.getArguments()
獲得的也是 Bundle
,但由於這是 Bundle
的經常使用用法,因此特地爲此定義一個不一樣的前綴。
例如:
// 注意:字段的值與名稱相同以免重複問題
static final String PREF_EMAIL = "PREF_EMAIL";
static final String BUNDLE_AGE = "BUNDLE_AGE";
static final String ARGUMENT_USER_ID = "ARGUMENT_USER_ID";
// 與意圖相關的項使用完整的包名做爲值的前綴
static final String EXTRA_SURNAME = "com.myapp.extras.EXTRA_SURNAME";
static final String ACTION_OPEN_USER = "com.myapp.action.ACTION_OPEN_USER";
複製代碼
代碼中每一行文本的長度都應該不超過 160 個字符。雖然關於此規則存在不少爭論,但最終決定還是以 160 個字符爲上限,若是行長超過了 160(AS 窗口右側的豎線就是設置的行寬末尾 ),咱們一般有兩種方法來縮減行長。
不過存在如下例外狀況:
這沒有一個準確的解決方案來決定如何換行,一般不一樣的解決方案都是有效的,可是有一些規則能夠應用於常見的狀況。
除賦值操做符以外,咱們把換行符放在操做符以前,例如:
int longName = anotherVeryLongVariable + anEvenLongerOne - thisRidiculousLongOne
+ theFinalOne;
複製代碼
賦值操做符的換行咱們放在其後,例如:
int longName =
anotherVeryLongVariable + anEvenLongerOne - thisRidiculousLongOne + theFinalOne;
複製代碼
當同一行中調用多個函數時(好比使用構建器時),對每一個函數的調用應該在新的一行中,咱們把換行符插入在 .
以前。
例如:
Picasso.with(context).load("https://blankj.com/images/avatar.jpg").into(ivAvatar);
複製代碼
咱們應該使用以下規則:
Picasso.with(context)
.load("https://blankj.com/images/avatar.jpg")
.into(ivAvatar);
複製代碼
當一個方法有不少參數或者參數很長的時候,咱們應該在每一個 ,
後面進行換行。
好比:
loadPicture(context, "https://blankj.com/images/avatar.jpg", ivAvatar, "Avatar of the user", clickListener);
複製代碼
咱們應該使用以下規則:
loadPicture(context,
"https://blankj.com/images/avatar.jpg",
ivAvatar,
"Avatar of the user",
clickListener);
複製代碼
RxJava 的每一個操做符都須要換新行,而且把換行符插入在 .
以前。
例如:
public Observable<Location> syncLocations() {
return mDatabaseHelper.getAllLocations()
.concatMap(new Func1<Location, Observable<? extends Location>>() {
@Override
public Observable<? extends Location> call(Location location) {
return mRetrofitService.getLocation(location.id);
}
})
.retry(new Func2<Integer, Throwable, Boolean>() {
@Override
public Boolean call(Integer numRetries, Throwable throwable) {
return throwable instanceof RetrofitError;
}
});
}
複製代碼
參考文檔:
source.android.com/source/code…
developer.android.com/kotlin/styl…
github.com/Blankj/Andr…
本文同步發表於個人微信公衆號,微信搜索 nanchen 便可關注