Java程式碼風格和在idea中的一些設定
原始檔基本設定
1. 檔名
駝峰標識,.java
結尾
2. 編碼
統一為UTF-8
Transport…可以解決property檔案不能正常顯示為中文的問題
3. 特殊字元
- 儘量使用轉義字元(\t, \n等),而不是八進位制的(\012)或者Unicode轉義(\u000a)
- 非ascii字元,最容易理解,使用unicode字元,比如:μ,不使用轉義:\u03bcs
原始檔結構
- license
- package
- import
- 一個主類
每一個部分之間用一個空行隔開
1. license
2. 包名
不換行(line-wrapped),一行寫完
3. import
- import的時候不使用萬用字元*
- 不單獨區分jdk的import和其他import,只按照靜態引用和非靜態引用分塊
- 靜態引用、非靜態引用之間用空行分開,各自的塊中間沒有空行
4. 類
- 一個檔案只有一個top-level類
格式
1. 大括號(braces)
- If,lese,if else,for,do,while,這些語句塊都要用大括號
- 這些關鍵字後面的左大括號前面要有空格(沒有換行),後面換行,右大括號前後都需要換行(如果右大括號後面有一些特殊的語句塊的時候不需要換行,如:else,catch)
- 如果語句塊是空的,可以簡寫
// This is acceptable
void doNothing() {}
// This is equally acceptable
void doNothingElse() {
}
// This is not acceptable: No concise empty blocks in a multi-block statement
try {
doSomething();
} catch (Exception e) {}
2. 塊縮排
4個空格
3. 每行一個宣告
- 變數不要連續宣告
- 每行一個語句(一個分號)
4. 列長限制120
列外情況:
- 不可能遵守的這個規則的情況(比如:URL)
- package、import
- 註釋裡面的會被拷貝貼上到命令列裡執行的命令
5. 折行(line-wrapping)
1. 什麼時候折行?
究竟應該在哪裡折行?隨性,一個主要的指導是:最好在語法層面上折行
- 如果折行的地方正好是非等號運算子,則在運算子前面折行,包括類似運算子的符號,比如:
- 點運算子,”.”
- 泛型,””
- 如果折行的地方正好是等號運算子,則在符號後面折行,包括類似等號運算子,比如:
- foreach的”:”
- 方法或者構造方法的名字和左括號(“(“)最好在一行,即方法的左括號後折行
- 逗號(“,”)和他前面的部分在一行,逗號後折行
- lamda的箭頭後面(的”{“)不換行,除非j方法體部分不需要大括號
MyLambda<String, Long, Object> lambda =
(String label, Long value, Object obj) -> {
...
};
Predicate<String> predicate = str ->
longExpressionInvolving(str);
2. 有折行時候的縮排
- 有折行的情況下,每次折行都至少縮排4個空格(相較於第一行)
- 如果多次縮排是語法上並行的元素,那麼可以縮排相同,否則在持續縮排中,每次都要增加4個空格
- 沒有必要為了水平對齊而增加額外的空格
6. 空白
垂直的空白
- 欄位、構造方法、成員方法、內部類、靜態初始化、例項初始化,這些之間用空行隔開
- 成員欄位之間不用空行,除非為了邏輯上的分組
- enum欄位之間用空行隔開
- 為了組織程式碼而進行邏輯分割可以使用空行
- 類第一個成員前面不需要空行,最後一個成員後面也不需要空行
- 欄位、構造方法、成員方法、內部類、靜態初始化、例項初始化,這些之間用空行隔開
水平空白
關鍵字後面的小括號(“(“)之間要有一個空格作為分隔,if,for,catch
關鍵字前面的大括號(“}”)之間要有一個空格作為分隔,else, catch
左大括號(“{“)前面要有一個空格,兩個例外:
@SomeAnnotation({a, b})
(no space is used)String[][] x = {{"foo"}};
(no space is required between{{
)
二元或者三元運算子前後都要有空格,包括類似運算子的符號,如:
- 泛型中,
<T extends Foo & Bar>
- foreach中”:”前後
- lamda表示式的”->”前後
但是不包括:
- 點運算子”.”
- 泛型中,
在
,:;
後面有空格,還有強轉的右括號後面”)”行末註釋”//”兩側都需要空格,多個是允許的,但不是必須的
在變數型別和宣告之間:List list
陣列初始化的大括號裡面,左大括號後面和右大括號前面的空格不是必須的
new int[] {5, 6}
andnew int[] { 5, 6 }
are both valid水平對齊所需要的空白:不需要
增加維護成本
7. 加上分組用的小括號
便於理解運算順序,而不必記住Java優先順序表
8. 特定的一些構造
enum
如果元素有構造方法或者一般方法的情況,元素之間可以用空行隔開
private enum Answer { YES { @Override public String toString() { return "yes"; } }, NO, MAYBE }
如果沒有構造方法等可以用下面的方式
private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
變數宣告
- 一次宣告一個變數,不要出現如
int a, b
; - 區域性變數在必要的還是再宣告,保證最小化生命週期
- 一次宣告一個變數,不要出現如
陣列
- 陣列初始化可以當做一個block,例如:
new int[] { new int[] { 0, 1, 2, 3 0, } 1, 2, new int[] { 3, 0, 1, } 2, 3 } new int[] {0, 1, 2, 3}
- 方括號跟在型別後面,方括號和型別共同組成一個型別,
String[] arr
,而不是String arr[]
switch語句
- case縮排4個空格
- 冒號後換行
- 有穿透的(case沒有break)還是要說明,註釋
- 保留default,即使沒有程式碼
註解
- 一個註解單獨一行
註釋
多行註釋中第一行和最後一行不寫註釋
/* * This is // And so /* Or you can * okay. // is this. * even do this. */ */
修飾詞
Java中修飾詞的順序
public protected private abstract default static final transient volatile synchronized native strictfp
數字字面值
如果是
long
型別的字面值,最後加”L”,而不是”l”,如:long length = 1000L;
命名
1. 通用的命名規則
僅僅使用ascii字元和數字,少數情況使用下劃線(比如:常量命名,大寫,多個單詞之間使用下劃線隔開)
2. 每種識別符號對應的命名規則
package:全小寫,不使用下劃線
class:
- 使用首字母大寫的駝峰標識
- 類名使用名詞或者名詞短語,介面使用名詞或者名詞短語,部分情況使用形容詞(Readable)
- 註解沒有指定的規則
- 測試類,<被測試的類名>+Test
method:
- 方法名首字母小寫的駝峰標識
- 方法名是動詞或者動詞短語
- 測試方法名稱:test+<被測試的方法名>+
constant:
- 全大寫,單詞之間用下劃線隔開
- 名詞或者名詞短語
- 怎麼才算常量:
- static final修飾的原始型別、String、不可變的集合
- 物件所有可被訪問的狀態不可變
非常量欄位命名
- 首字母小寫,駝峰標識
- 名詞或者名詞短語
形參名
- 首字母小寫,駝峰標識
- public方法的引數名不能只有一個字母
區域性變數命名
- 首字母小寫的駝峰標識
- 區域性變數即使是不可變的,也不能按照常量的方法來命名
泛型引數
下面兩種方式中選一個
- 單個大寫字母后面跟上數字
- 若泛型有上限,則上限類名後面跟上大寫的
T
3. 駝峰標識的具體方法
怎麼將多個單詞或者單詞短語轉換為駝峰標識的命名方法
- 將所有的單詞或者短語轉換為ascii,並且刪除中間的任何撇號,如:”Müller’s algorithm”轉換為 “Muellers algorithm”。
- 將上面得到的劃分為單詞,使用空格或者標點符號(特別是連字元)作為分界線。如果一個短語有慣常用法,則保留慣常用法,比如:AdWords 轉換為Ad Words
- 將得到的字串全部轉換為小寫,然後將劃分後的每一個單詞的首字母大寫(如果是第一個單詞則可能第一個單詞的首字母小寫)
- 然後將字串連線起來,去掉空格
一些例子:
需要轉換的字串 | 正確的 |
“XML HTTP request” | XmlHttpRequest |
“new customer ID” | newCustomerId |
“inner stopwatch” | innerStopwatch |
“supports IPv6 on iOS?” | supportsIpv6OnIos |
“YouTube importer” | YouTubeImporter YoutubeImporter |
程式設計實踐
1. 總是寫@Override
2. 不忽略任何異常
需要catch異常,並做處理,如果沒有必要處理,要用註釋說明
3. 使用類名來引用靜態成員
4. 不重寫Object.finalize
如果非要重寫,請閱讀並理解《Effective Java》裡面避免Finalizer
的部分
其他在idea中的設定
換行符
統一為”\n”
縮排
統一為:tab 4 個空格
參考