一、代碼風(fēng)格
代碼風(fēng)格實(shí)際上就是合理使用縮進(jìn)、空格、換行,目的是讓代碼可讀性更強(qiáng)。大家記憶時(shí)記清楚用什么樣的縮進(jìn),哪些時(shí)候使用空格,哪些時(shí)候使用換行,單行代碼不要太長就可以,這部分內(nèi)容通過兩三次的回顧很容易養(yǎng)成習(xí)慣,因?yàn)槭蔷幋a中最長用到的。
可參考以下代碼:
public static void main(String[] args) {
// 縮進(jìn) 4 個(gè)空格
String say = "hello";
// 運(yùn)算符的左右必須有一個(gè)空格
int flag = 0;
// 關(guān)鍵詞if/for/while/switch/do與括號(hào)之間必須有一個(gè)空格,括號(hào)內(nèi)的 flag 與左括號(hào),0 與右括號(hào)不需要空格
if (flag == 0) {
System.out.println(say);
}
// 左大括號(hào)前加空格且不換行;左大括號(hào)后換行
if (flag == 1) {
System.out.println("world");
// 右大括號(hào)前換行,右大括號(hào)后有 else,不用換行
} else {
System.out.println("ok");
// 在右大括號(hào)后直接結(jié)束,則必須換行
}
StringBuffer sb = new StringBuffer();
// 超過120個(gè)字符的情況下,換行縮進(jìn)4個(gè)空格,點(diǎn)號(hào)和方法名稱一起換行
sb.append("zi").append("xin")...
.append("huang")...
.append("huang")...
.append("huang");
// 任何二目、三目運(yùn)算符的左右兩邊都需要加一個(gè)空格
int result = flag == 0 ? 1 : 0;
}
下邊是另外幾點(diǎn)需要注意的:
- 注釋的雙斜線與注釋內(nèi)容之間有且僅有一個(gè)空格。
- 方法參數(shù)在定義和傳入時(shí),多個(gè)參數(shù)逗號(hào)后邊必須加空格,如method("a", "b")。
- 沒有必要增加若干空格來使某一行的字符與上一行對(duì)應(yīng)位置的字符對(duì)齊。
- 方法體內(nèi)的執(zhí)行語句組、變量的定義語句組、不同的業(yè)務(wù)邏輯之間或者不同的語義 之間插入一個(gè)空行。相同業(yè)務(wù)邏輯和語義之間不需要插入空行。沒有必要插入多個(gè)空行進(jìn)行隔開。
二、日志
1.日志配置
主要有日志文件名稱、日志輸出級(jí)別、日志是否向上層傳遞、日志保留時(shí)間。
- 日志文件推薦至少保存15天,因?yàn)橛行┊惓>邆湟浴爸堋睘轭l次發(fā)生的特點(diǎn)。
- 避免重復(fù)打印日志,浪費(fèi)磁盤空間,務(wù)必在 log4j.xml 中設(shè)置 additivity=false
- 謹(jǐn)慎地記錄日志。生產(chǎn)環(huán)境禁止輸出 debug 日志;有選擇地輸出 info 日志;如果使 用 warn 來記錄剛上線時(shí)的業(yè)務(wù)行為信息,一定要注意日志輸出量的問題,避免把服務(wù)器磁盤 撐爆,并記得及時(shí)刪除這些觀察日志。
- 應(yīng)用中的擴(kuò)展日志(如打點(diǎn)、臨時(shí)監(jiān)控、訪問日志等)命名方式:appName_logType_logName.log。logType:日志類型,推薦分類有stats/desc/monitor/visit 等;logName:日志描述。這種命名的好處:通過文件名就可知 道日志文件屬于什么應(yīng)用,什么類型,什么目的,也有利于歸類查找。
2.日志使用
- 應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的 API,而應(yīng)依賴使用日志框架SLF4J 中的 API,使用門面模式的日志框架,有利于維護(hù)和各個(gè)類的日志處理方式統(tǒng)一。
- 對(duì) trace/debug/info 級(jí)別的日志輸出,必須使用條件輸出形式或者使用占位符的方式。
- 異常信息應(yīng)該包括兩類信息:案發(fā)現(xiàn)場(chǎng)信息和異常堆棧信息。如果不處理,那么通過 關(guān)鍵字 throws 往上拋出。推薦
logger.error(各類參數(shù)或者對(duì)象toString + "_" + e.getMessage(), e);這種格式,不要簡單的輸出e.getMessage(),那樣具體的錯(cuò)誤信息都被隱藏,很不利于排查問題。 - 注意日志輸出級(jí)別和使用場(chǎng)景,避免大量調(diào)試日志被生成,最近就遇到過一次在高頻接口輸出調(diào)試信息,忘記清理,在調(diào)用高峰拖死了tomcat;在生成環(huán)境,盡量只記錄異常信息和較重要的業(yè)務(wù)信息,且控制其量。
- while、for循環(huán)等內(nèi)部的異常需要特別注意發(fā)生異常的條件,曾經(jīng)遇到過while循環(huán)從redis隊(duì)列內(nèi)取值(事件),redis服務(wù)宕機(jī),結(jié)果異常日志刷爆磁盤的情況。