阿里巴巴Java開發手冊1.7.0(嵩山版)
一、編程規約
(一)命名風格
-
所有命名不得以下劃線和$開始和結束,
-
所有命名不得以拼音或拼音英文混合,
-
類名使用UpperCamelCase風格,
-
方法名、引數名、成員變數、區域變數都統一使用lowerCamelCase風格,
-
常量命名全部大寫,單詞間用下劃線隔開,力求語意表達完整清楚,不要嫌名字長,
-
抽象類命名使用 Abstract 或 Base 開頭;例外類命名使用 Exception 結尾;
測驗類命名以它要測驗的類的名稱開始,以 Test 結尾,
-
型別與中括號緊挨相連來表示陣列,(定義整形陣列 int[] arrayDemo,)
-
包名統一使用小寫,點分隔符之間有且僅有一個自然語意的英語單詞,包名統一使用
單數形式,但是類名如果有復數含義,類名可以使用復數形式, -
杜絕完全不規范的縮寫,避免望文不知義,(AbstractClass“縮寫”成 AbsClass;condition“縮寫”成 condi;Function 縮寫”成 Fu)
-
在常量與變數的命名時,表示型別的名詞放在詞尾,以提升辨識度,(動+名詞)
-
Service/DAO 層方法命名規約
1) 獲取單個物件的方法用 get 做前綴,
2) 獲取多個物件的方法用 list 做前綴,復數結尾,如:listObjects,
3) 獲取統計值的方法用 count 做前綴,
4) 插入的方法用 save/insert 做前綴,推薦save,
5) 洗掉的方法用 remove/delete 做前綴,推薦remove,
6) 修改的方法用 update 做前綴,
(二)常量定義
- 不允許出現魔法值(未經過預先定義的值)直接出現在代碼中,String key = "Id#taobao_" + tradeId;,其中的字串就是魔法值,
- 在 long 或者 Long 賦值時,數值后使用大寫字母 L,不能是小寫字母 l,
(三)代碼格式
-
大括號,單行放一起 { },多行:
1) 左大括號前不換行,
2) 左大括號后換行,
3) 右大括號前換行,
4) 右大括號后還有 else 等代碼則不換行;表示終止的右大括號后必須換行, -
if/for/while/switch/do 等保留字與括號之間都必須加空格,
-
任何二目、三目運算子的左右兩邊都需要加一個空格,包括賦值運算子=、邏輯運算子&&、加減乘除符號等,
-
采用 4 個空格縮進,
-
注釋的雙斜線與注釋內容之間有且僅有一個空格,
-
單行字符數限制不超過 120 個,超出需要換行,換行時遵循如下原則:
1)第二行相對第一行縮進 4 個空格,從第三行開始,不再繼續縮進,參考示例,
2)運算子與下文一起換行,
3)方法呼叫的點符號與下文一起換行,
4)方法呼叫中的多個引數需要換行時,在逗號后進行,
5)在括號前不要換行, -
方法引數在定義和傳入時,多個引數逗號后面必須加空格,
下例中實參的 args1,后邊必須要有一個空格,
method(args1, args2, args3); -
IDE 的 text file encoding 設定為 UTF-8; IDE 中檔案的換行符使用 Unix 格式,不要
使用 Windows 格式, -
不同邏輯、不同語意、不同業務的代碼之間插入一個空行分隔開來以提升可讀性,
(四)OOP規約
-
Object 的 equals 方法容易拋空指標例外,應使用常量或確定有值的物件來呼叫 equals ,
正例:"test".equals(object);
反例:object.equals("test");
說明:推薦使用 JDK7 引入的工具類 java.util.Objects#equals(Object a, Object b) -
所有整型包裝類物件之間值的比較,全部使用 equals 方法比較,
-
任何貨幣金額,均以最小貨幣單位且整型型別來進行存盤,
-
浮點數之間的等值判斷,基本資料型別不能用==來比較,包裝資料型別不能用 equals來判斷,

-
如上所示 BigDecimal 的等值比較應使用 compareTo()方法,而不是 equals()方法,
equals()方法會比較值和精度 (1.0 與 1.00 回傳結果為 false) ,而 compareTo()則會忽略精度,
-
定義資料物件 DO 類時,屬性型別要與資料庫欄位型別相匹配,
-
禁止使用構造方法 BigDecimal(double) 的方式把 double 值轉化為 BigDecimal 物件,
說明:BigDecimal(double)存在精度損失風險,在精確計算或值比較的場景中可能會導致業務邏輯例外,
如:BigDecimal g = new BigDecimal(0.1F); 實際的存盤值為:0.10000000149
正例:優先推薦入參為 String 的構造方法,或使用 BigDecimal 的 valueOf 方法,此方法內部其實執行了
Double 的 toString,而 Double 的 toString 按 double 的實際能表達的精度對尾數進行了截斷,
BigDecimal recommend1 = new BigDecimal("0.1"); // String
BigDecimal recommend2 = BigDecimal.valueOf(0.1); // valueOf(double) -
關于基本資料型別與包裝資料型別的使用標準如下:
1) 【強制】所有的 POJO 類屬性必須使用包裝資料型別,
2) 【強制】RPC 方法的回傳值和引數必須使用包裝資料型別,
3) 【推薦】所有的區域變數使用基本資料型別,
說明:POJO 類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何 NPE (NullPointerException,空指標例外)問題,或者入庫檢查,都由使用者來保證,
正例:資料庫的查詢結果可能是 null,因為自動拆箱,用基本資料型別接收有 NPE 風險,
反例:某業務的交易報表上顯示成交總額漲跌情況,即正負 x%,x 為基本資料型別,呼叫的 RPC(Remote Procedure Call) 服務,呼叫不成功時,回傳的是默認值,頁面顯示為 0%,這是不合理的,應該顯示成中劃線-,所以包裝資料型別
的 null 值,能夠表示額外的資訊,如:遠程呼叫失敗,例外退出,package java_wrapper; public class Cat { String name; int month; double weight; } package java_wrapper; public class CatTest { public static void main(String[] args) { Cat one = new Cat(); System.out.println("小貓的昵稱:"+one.name); System.out.println("小貓的年齡:"+one.month); System.out.println("小貓的體重:"+one.weight); } } 小貓的昵稱:null 小貓的年齡:0 小貓的體重:0.0package java_wrapper; public class Cat { String name; Integer month; Integer weight; } 小貓的昵稱:null 小貓的年齡:null 小貓的體重:null
基本型別 包裝器型別 boolean Boolean char Character int Integer byte Byte short Short long Long float Float double Double -
POJO 類必須寫 toString 方法,使用 IDE 中的工具:source> generate toString時,如果繼承了另一個 POJO 類,注意在前面加一下 super.toString,
說明:在方法執行拋出例外時,可以直接呼叫 POJO 的 toString()方法列印其屬性值,便于排查問題, -
禁止在 POJO 類中,同時存在對應屬性 xxx 的 isXxx()和 getXxx()方法,框架在呼叫屬性 xxx 的提取方法時,并不能確定哪個方法一定是被優先呼叫到的,
-
類內方法定義的順序依次是:公有方法或保護方法 > 私有方法 > getter / setter方法,
-
回圈體內,字串的連接方式,使用 StringBuilder 的 append 方法進行擴展,
說明:下例中,反編譯出的位元組碼檔案顯示每次回圈都會 new 出一個 StringBuilder 物件,然后進行 append
操作,最后通過 toString 方法回傳 String 物件,造成記憶體資源浪費,
反例:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}
public class DemoStringBuilder2 { public static void main(String[] args) { StringBuilder bu=new StringBuilder(); //append方法回傳的是this,呼叫方法的物件bu,this==bu bu.append("abc"); System.out.println(bu); //abc bu.append("abc"); bu.append("2"); bu.append("true"); bu.append("哈嘍"); bu.append("8.8"); bu.append("abc"); System.out.println(bu); //abc2true哈嘍8.8abc //鏈式編程:方法回傳值是一個物件,可以繼續呼叫方法 System.out.println("abc".toUpperCase().toLowerCase().toLowerCase()); bu.append("abc").append(1).append("你好").append(789); System.out.println(bu); String myStr = bu.toString(); // 回傳String物件 } } -
(五)日期時間
-
【強制】日期格式化時,傳入 pattern 中表示年份統一使用小寫的 y,
說明:日期格式化時,yyyy 表示當天所在的年,而大寫的 YYYY 代表是 week in which year(JDK7 之后
引入的概念),意思是當天所在的周屬于的年份,一周從周日開始,周六結束,只要本周跨年,回傳的 YYYY
就是下一年,
正例:表示日期和時間的格式如下所示:
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")推薦使用java.util.Date;
import java.util.Date; public class SimpleDateFormatDemo { public static void main(String[] args) { Date currentTime = new Date(); System.out.println(currentTime); // 輸出:Mon Feb 18 10:24:30 CST 2019 } }使用format()方法將日期轉換為字串
import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatDemo { public static void main(String[] args) { Date currentTime = new Date(); System.out.println(currentTime); // Mon Feb 18 13:53:50 CST 2019 SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat simpleDateFormat3 = new SimpleDateFormat("yyyy/MM/dd"); System.out.println(simpleDateFormat1.format(currentTime)); // 輸出2019-02-18 13:53:50.629 System.out.println(simpleDateFormat2.format(currentTime)); // 輸出2019-02-18 System.out.println(simpleDateFormat3.format(currentTime)); // 輸出2019/02/18 } }使用parse()方法將字串轉換為日期
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String strDate1 = "2019-02-18 13:58"; Date date1 = simpleDateFormat1.parse(strDate1); System.out.println(date1); // 輸出 Mon Feb 18 13:53:50 CST 2019 -
【強制】在日期格式中分清楚大寫的 M 和小寫的 m,大寫的 H 和小寫的 h 分別指代的意義,
1) 表示月份是大寫的 M;
2) 表示分鐘則是小寫的 m;
3) 24 小時制的是大寫的 H;
4) 12 小時制的則是小寫的 h, -
**【強制】獲取當前毫秒數:System.currentTimeMillis(); **
(六)集合處理
-
【強制】判斷所有集合內部的元素是否為空,使用 isEmpty()方法,而不是 size(),
正例:
正例: Map<String, Object> map = new HashMap<>(16); if(map.isEmpty()) { System.out.println("no element in this map."); }
(七)控制陳述句
-
【強制】當 switch 括號內的變數型別為 String 并且此變數為外部引數時,必須先進行 null判斷,switch陳述句必須包含default,

-
三目運算子 condition? 運算式 1 : 運算式 2 中,高度注意運算式 1 和 2 在型別對齊時,
可能拋出因自動拆箱導致的 NPE 例外,

-
(八)注釋規約
- 【強制】所有的抽象方法 ( 包括介面中的方法 ) 必須要用 Javadoc 注釋、除了回傳值、引數、例外說明外,還必須指出該方法做什么事情,實作什么功能,對子類的實作要求,或者呼叫注意事項,請一并說明,
- 【強制】所有的類都必須添加創建者和創建日期,
- 【強制】方法內部單行注釋,在被注釋陳述句上方另起一行,使用//注釋,方法內部多行注釋使用/* */注釋,注意與代碼對齊,
- 【參考】謹慎注釋掉代碼,在上方詳細說明,而不是簡單地注釋掉,如果無用,則洗掉,
二、MySQL 資料庫
(一) 建表規約
-
【強制】表達是與否概念的欄位,必須使用 is_xxx 的方式命名,資料型別是 unsigned tinyint
(1 表示是,0 表示否),unsigned是指的無符號,就是沒有負數,只能用正數和0,此時unsigned修飾的欄位的值可以達到的最大值是原來的最大值加1,即原來一個tinyint欄位能表示的范圍是:-128 ~ 127,而unsigned修飾的欄位范圍是 0 ~ 255.
資料型別 默認范圍 unsigned范圍 tinyint -2^7 ~ 2^7-1 0 ~ 2^8-1 -
【強制】表名、欄位名必須使用小寫字母或數字 , 禁止出現數字開頭,禁止兩個下劃線中間只
出現數字,資料庫欄位名的修改代價很大,因為無法進行預發布,所以欄位名稱需要慎重考慮,
說明:MySQL 在 Windows 下不區分大小寫,但在 Linux 下默認是區分大小寫,因此,資料庫名、表名、
欄位名,都不允許出現任何大寫字母,避免節外生枝, -
表名不使用復數名詞,
-
禁用保留字,如 desc、range、match、delayed 等,
-
【強制】主鍵索引名為 pk_ 欄位名;唯一索引名為 uk 欄位名 ; 普通索引名則為 idx 欄位名,
說明:pk 即 primary key;uk 即 unique key;idx_ 即 index 的簡稱, -
【強制】小數型別為 decimal,禁止使用 float 和 double,
說明:在存盤的時候,float 和 double 都存在精度損失的問題,很可能在比較值的時候,得到不正確的
結果,如果存盤的資料范圍超過 decimal 的范圍,建議將資料拆成整數和小數并分開存盤, -
【強制】如果存盤的字串長度幾乎相等,使用 char 定長字串型別,
-
【強制】 varchar 是可變長字串,不預先分配存盤空間,長度不要超過 5000,如果存盤長度
大于此值,定義欄位型別為 text,獨立出來一張表,用主鍵來對應,避免影響其它欄位索引效
率, -
【強制】表必備三欄位:id, create_time, update_time,
說明:其中 id 必為主鍵,型別為 bigint unsigned、單表時自增、步長為 1,create_time, update_time
的型別均為 datetime 型別,前者現在時表示主動式創建,后者過去分詞表示被動式更新, -
【推薦】表的命名最好是遵循“業務名稱_表的作用”,正例:alipay_task / force_project / trade_config
(二)SQL陳述句
-
【強制】不要使用 count(列名)或 count(常量)來替代 count(*),count(*)是 SQL92 定義的標
準統計行數的語法,跟資料庫無關,跟 NULL 和非 NULL 無關,說明:count(*)會統計值為 NULL 的行,而 count(列名)不會統計此列為 NULL 值的行,
-
【強制】當某一列的值全是 NULL 時,count(col)的回傳結果為 0,但 sum(col)的回傳結果為
NULL,因此使用 sum()時需注意 NPE 問題,正例:可以使用如下方式來避免 sum 的 NPE 問題:SELECT IFNULL(SUM(column), 0) FROM table;
-
【強制】使用 ISNULL() 來判斷是否為 NULL 值,
-
【強制】對于資料庫中表記錄的查詢和變更,只要涉及多個表,都需要在列名前加表的別名(或表名)進行限定,SQL 陳述句中表的別名前加 as,
本文來自博客園,作者:靠譜楊,轉載請注明原文鏈接:https://www.cnblogs.com/rainbow-1/p/16175872.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460839.html
標籤:其他
上一篇:索引有什么分類?
