原文地址 把重點記錄下
https://source.android.com/source/code-style.html
1.不要忽略異常(空的catch字句)
不要不捕獲異常
2.不要使用Findlizer
Finalizer是一種在對象被垃圾回收時執(zhí)行一段代碼的方法。雖然他們可以方便地進行清理(特別是外部資源)只酥,但是沒有保證什么時候調(diào)用終結(jié)器(甚至?xí)徽{(diào)用)。
Android不使用finalizer。在大多數(shù)情況下,您可以從具有良好異常處理的終結(jié)器中完成所需的操作颓哮。如果你絕對需要它趴乡,定義一個close()方法(或類似的),并準確地記錄該方法需要被調(diào)用時(見InputStream的例子)惑淳。在這種情況下,只要不希望溢出日志饺窿,就可以打印來自終結(jié)器的短日志消息歧焦,但不是必需的。
3.Java庫規(guī)則
舊的代碼使用舊的庫 在創(chuàng)建新的組件不要使用不推薦使用的庫
有使用Android的Java庫和工具的約定肚医。在某些情況下绢馍,約定以重要的方式發(fā)生了變化,較舊的代碼可能使用已棄用的模式或庫肠套。當使用這樣的代碼舰涌,可以繼續(xù)現(xiàn)有的風(fēng)格。但是你稚,在創(chuàng)建新組件時舵稠,不要使用不推薦使用的庫。
4.Java風(fēng)格規(guī)則
使用Javadoc標準注釋
每個文件應(yīng)在頂部有一個版權(quán)聲明入宦,其后是package和import語句(每個塊由空行分隔)哺徊,最后是類或接口聲明。在Javadoc注釋中乾闰,描述類或接口的作用落追。
你寫的每個類和公共方法必須包含一個Javadoc注釋,至少有一個句子描述類或方法的作用涯肩。這句話應(yīng)以第三人稱描述性動詞開始轿钠。
如何為javadoc編寫注釋 [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html]
5.寫短的方法
如果一個方法超過40行左右,考慮它是否可以分解而不傷害程序的結(jié)構(gòu)病苗。
6.在標準位置定義字段
在文件的頂部或在使用它們的方法之前定義字段疗垛。
7.限制變量范圍
將局部變量范圍保持最小
循環(huán)變量應(yīng)在for語句本身中聲明
8.次序?qū)胝Z句
android import
第三方 import
java 和 javax
9.使用縮進空格
我們使用四(4)個空格縮進塊,而不是制表符硫朦。當有疑問時贷腕,要與周圍的代碼一致。
我們使用八(8)個空格縮進進行換行,包括函數(shù)調(diào)用和賦值泽裳。例如瞒斩,這是正確的:
10.遵循字段命名約定
非公共,非靜態(tài)字段名以m開頭涮总。
靜態(tài)字段名稱以s開頭胸囱。
其他字段以小寫字母開頭。
公共靜態(tài)最終字段(常量)為ALL_CAPS_WITH_UNDERSCORES瀑梗。
11.使用標準括號樣式
大括號不要自己一行; 大括號和代碼在同一行:
我們需要在條件語句周圍添加括號烹笔。異常:如果整個條件(條件和主體)適合一行,你可以(但沒有義務(wù))把它全部放在一行上抛丽。例如箕宙,這是可以接受的:
12.限制線長度
代碼中的每行文字長度最多為100個字符。雖然許多討論都圍繞這個規(guī)則铺纽,但是決定仍然是100個字符是最大值,以下例外:
如果注釋行包含示例命令或長度超過100個字符的文字URL哟忍,則該行可能長于100個字符狡门,以便于剪切和粘貼。
導(dǎo)入行可以超過限制锅很,因為人們很少看到它們(這也簡化了工具寫入)其馏。
使用標準Java注釋
注釋應(yīng)該在同一語言元素的其他修飾符之前。簡單的標記注釋(例如@Override)可以與語言元素列在同一行爆安。如果有多個注釋或參數(shù)化注釋叛复,它們應(yīng)按字母順序逐行列出。
13.使用標準Java注釋
注釋應(yīng)該在同一語言元素的其他修飾符之前扔仓。簡單的標記注釋(例如@Override)可以與語言元素列在同一行褐奥。如果有多個注釋或參數(shù)化注釋,它們應(yīng)按字母順序逐行列出翘簇。
Java中的三個預(yù)定義注釋的Android標準實踐是:
@Deprecated:當不建議使用注釋元素時撬码,必須使用@Deprecated注釋。如果使用@Deprecated注釋版保,則還必須具有@deprecated Javadoc標記呜笑,并且應(yīng)該命名替代實現(xiàn)。此外彻犁,請記住叫胁,一個@Deprecated方法 仍然應(yīng)該工作。如果您看到舊代碼帶有@deprecated Javadoc標記汞幢,請?zhí)砑覢Deprecated注釋驼鹅。
@Override:當方法從超類覆蓋聲明或?qū)崿F(xiàn)時,必須使用@Override注釋。例如谤民,如果使用@inheritdocs Javadoc標記堰酿,并從類(而不是接口)派生,則還必須注釋該方法@覆蓋父類的方法张足。
@SuppressWarnings:@SuppressWarnings注釋只應(yīng)在不可能消除警告的情況下使用触创。如果警告通過此“不可能消除”測試,則必須使用@SuppressWarnings注釋为牍,以確保所有警告都反映代碼中的實際問題哼绑。
當需要@SuppressWarnings注釋時,必須以TODO注釋作為前綴碉咆,解釋“不可能消除”條件抖韩。這通常會識別具有尷尬界面的違規(guī)類。例如:
// TODO: The third-party class com.third.useful.Utility.rotate() needs generics
@SuppressWarnings("generic-cast")
List<String> blix = Utility.rotate(blax);
當需要@SuppressWarnings注釋時疫铜,應(yīng)重構(gòu)代碼以隔離應(yīng)用注釋的軟件元素茂浮。
14.將首字母縮略詞作為詞
將縮寫詞和縮寫詞作為命名變量,方法和類中的單詞壳咕,以使名稱更易讀:
由于JDK和Android代碼庫在首字母縮略詞之間非常不一致席揽,因此幾乎不可能與周圍的代碼一致。因此谓厘,始終將首字母縮寫作為詞幌羞。
15.使用TODO注釋
使用TODO注釋代碼是臨時的,短期的解決方案竟稳,或者足夠好但不完美的代碼属桦。TODO應(yīng)在所有大寫字母中包含字符串TODO,后跟冒號:
// TODO: Remove this code after the UrlTable2 has been checked in.
和
// TODO: Change this to use a flag instead of a constant.
如果您的TODO的形式是“在未來的日期做某事”他爸,請確保您包括一個非常具體的日期(“修復(fù)在2005年11月”)或一個非常具體的事件(“刪除此代碼之后所有生產(chǎn)混音師理解協(xié)議V7 聂宾。“)诊笤。
16.日志節(jié)制
雖然記錄是必要的亏吝,但它對性能具有顯著的負面影響,并且如果不保持合理的簡短盏混,則快速失去其有用性蔚鸥。日志記錄工具提供五個不同級別的日志記錄:
ERROR:當發(fā)生致命事件時使用,即某些會有用戶可見的后果许赃,并且如果沒有顯式刪除某些數(shù)據(jù)止喷,卸載應(yīng)用程序,擦除數(shù)據(jù)分區(qū)或重新整理整個設(shè)備(或更糟)混聊,將無法恢復(fù)弹谁。此級別始終記錄。在ERROR級別上證明某些日志記錄的問題通常是被報告給統(tǒng)計信息收集服務(wù)器的好候選。
WARNING:在發(fā)生嚴重和意外事件時使用预愤,即某些會有用戶可見的后果沟于,但可能通過執(zhí)行一些明確的操作來恢復(fù),而不會丟失數(shù)據(jù)植康,從等待或重新啟動應(yīng)用程序到重新下載新版本的應(yīng)用程序或重新啟動設(shè)備旷太。此級別始終記錄。在WARNING級別進行某些日志記錄的問題也可能被考慮用于向統(tǒng)計信息收集服務(wù)器報告销睁。
INFORMATIVE: 使用注意到供璧,大多數(shù)人發(fā)生了有趣的事情,即當檢測到可能具有廣泛影響的情況時冻记,雖然不一定是錯誤睡毒。這樣的條件只能由合理地認為它是該域中最具權(quán)威性的模塊記錄(以避免非授權(quán)組件的重復(fù)日志記錄)。此級別始終記錄冗栗。
DEBUG:用于進一步注意設(shè)備上可能與調(diào)查和調(diào)試意外行為相關(guān)的內(nèi)容演顾。你應(yīng)該只記錄需要什么來收集有關(guān)你的組件發(fā)生什么的足夠的信息。如果你的調(diào)試日志主導(dǎo)日志隅居,那么你可能應(yīng)該使用詳細日志記錄钠至。
此級別將被記錄,即使在發(fā)布版本上军浆,并且需要被一個if (LOCAL_LOG)或if (LOCAL_LOGD) 塊包圍,其中LOCAL_LOG[D]在類或子組件中定義挡闰,因此可能存在禁用所有此類日志記錄的可能性乒融。因此,在if (LOCAL_LOG)塊中必須沒有活動邏輯摄悯。所有用于日志的字符串構(gòu)建也需要放置在if (LOCAL_LOG)塊內(nèi)赞季。如果它將導(dǎo)致字符串構(gòu)建在if (LOCAL_LOG)塊之外發(fā)生,則日志調(diào)用不應(yīng)該重新映射到方法調(diào)用中奢驯。
還有一些代碼仍然說if (localLOGV)申钩。這也被認為是可接受的,雖然名稱是非標準的瘪阁。
VERBOSE:用于一切撒遣。此級別將僅在調(diào)試版本上記錄,并且應(yīng)由if (LOCAL_LOGV)塊(或等效的)包圍管跺,因此可以默認編譯出來义黎。任何字符串構(gòu)建將從發(fā)布版本中刪除,并需要顯示在if (LOCAL_LOGV)塊內(nèi)豁跑。
筆記:
在給定的模塊中廉涕,除了VERBOSE級別之外,只有在可能的情況下才應(yīng)報告錯誤。在模塊內(nèi)的單個函數(shù)調(diào)用鏈中狐蜕,只有最內(nèi)層函數(shù)應(yīng)該返回錯誤宠纯,并且同一模塊中的調(diào)用者應(yīng)該只添加一些日志,如果這顯著幫助隔離問題层释。
在一個模塊鏈中婆瓜,除了VERBOSE級別以外,當?shù)图壞K檢測到來自高級模塊的無效數(shù)據(jù)時湃累,低級模塊只應(yīng)將此情況記錄到DEBUG日志中勃救,并且僅當日志記錄提供對呼叫者不可用的信息。具體來說治力,不需要記錄拋出異常的情況(異常應(yīng)包含所有相關(guān)信息)蒙秒,或者記錄的唯一信息包含在錯誤代碼中。這在框架和應(yīng)用程序之間的交互中尤其重要宵统,由框架正確處理的第三方應(yīng)用程序引起的條件不應(yīng)該觸發(fā)高于DEBUG級別的日志記錄晕讲。
當通常證明某些日志記錄可能發(fā)生多次的條件時,實施一些速率限制機制以防止用相同(或非常相似)信息的許多重復(fù)副本來溢出日志是一個好主意马澈。
網(wǎng)絡(luò)連接的損失被認為是常見的瓢省,完全預(yù)期的,不應(yīng)該被無償?shù)赜涗浫唷T趹?yīng)用程序中發(fā)生后果的網(wǎng)絡(luò)連接丟失應(yīng)在DEBUG或VERBOSE級別記錄(取決于后果是否足夠嚴重勤婚,并且意外足以登錄到發(fā)布版本中)。
在可由第三方應(yīng)用程序訪問或代表第三方應(yīng)用程序訪問的文件系統(tǒng)上具有完整的文件系統(tǒng)不應(yīng)該記錄在高于INFORMATIVE的級別涤伐。
來自任何不受信任的源(包括共享存儲上的任何文件或來自任何網(wǎng)絡(luò)連接的數(shù)據(jù))的無效數(shù)據(jù)被認為是預(yù)期的馒胆,并且當檢測到無效時,不應(yīng)該在高于DEBUG的級別觸發(fā)任何日志記錄日志記錄應(yīng)盡可能有限)凝果。
請記住祝迂,+在字符串上使用運算符時,隱式創(chuàng)建一個StringBuilder具有默認緩沖區(qū)大衅骶弧(16個字符)和可能的其他臨時String對象型雳,即顯式創(chuàng)建StringBuilders不比依賴于默認的'+'運算符更昂貴(事實上??可以更高效)。請記住山害,調(diào)用的代碼Log.v()在發(fā)布版本上編譯和執(zhí)行纠俭,包括構(gòu)建字符串,即使日志沒有被讀取浪慌。
任何意圖被其他人讀取并在發(fā)布版本中可用的日志記錄應(yīng)該是簡潔的柑晒,而不是含糊的,并且應(yīng)該是可以理解的眷射。這包括所有登錄到DEBUG級別匙赞。
如果可能佛掖,記錄應(yīng)該保持在一行,如果有意義涌庭。線長度最多可達80或100個字符是完全可以接受的芥被,如果可能,應(yīng)避免長度大于約130或160個字符(包括標簽的長度)坐榆。
不應(yīng)使用高于VERBOSE的級別記錄報告成功的日志拴魄。
用于診斷難以重現(xiàn)的問題的臨時日志應(yīng)該保存在DEBUG或VERBOSE級別,并且應(yīng)該包含在允許在編譯時完全禁用它的塊席镀。
小心日志中的安全漏洞匹中。應(yīng)避免私人信息。必須避免有關(guān)受保護內(nèi)容的信息豪诲。這在編寫框架代碼時尤其重要顶捷,因為事先不容易知道什么將是和不會是私人信息或受保護的內(nèi)容。
System.out.println()(或printf()本地代碼)永遠不要使用屎篱。System.out和System.err被重定向到/ dev / null服赎,所以你的打印語句將沒有可見的效果。然而交播,對于這些調(diào)用發(fā)生的所有字符串構(gòu)建仍然被執(zhí)行重虑。
記錄的黃金規(guī)則是,您的日志可能不會不必要地將其他日志推出緩沖區(qū)秦士,就像其他人可能不會推出您的日志缺厉。
17.始終一致
我們分開的想法:一致。如果您正在編輯代碼隧土,請花幾分鐘時間查看周圍的代碼并確定其樣式提针。如果該代碼使用if子句周圍的空格,你也應(yīng)該次洼。如果代碼注釋在他們周圍有一些星星框关贵,那么你的評論也有一些星星遇骑。
有風(fēng)格指導(dǎo)的要點是有一個通用的編碼詞匯卖毁,所以人們可以專注于你在說什么,而不是你如何說落萎。我們在這里提出全球風(fēng)格規(guī)則亥啦,所以人們知道詞匯,但本地風(fēng)格也很重要练链。如果你添加到一個文件的代碼看起來與現(xiàn)有的代碼有很大的不同翔脱,當讀者閱讀它時,它會使讀者脫離他們的節(jié)奏媒鼓。嘗試避免這一點届吁。
18.Javatests樣式規(guī)則
按照測試方法命名約定错妖,使用下劃線將要測試的內(nèi)容與要測試的特定案例分開。這種風(fēng)格使得更容易查看正在測試的案例疚沐。例如:
testMethod_specificCase1 testMethod_specificCase2
void testIsDistinguishable_protanopia() {
ColorMatcher colorMatcher = new ColorMatcher(PROTANOPIA)
assertFalse(colorMatcher.isDistinguishable(Color.RED, Color.BLACK))
assertTrue(colorMatcher.isDistinguishable(Color.X, Color.Y))
}