(一)java命名規范
1、變數、成員、方法名統一采用駝峰命名(lowerCamelCase),做到見語知其義
例子:變數——用戶資料(userList)、方法——getUserData(int type)等,
說明:正常變數定義使用駝峰命名,特殊的如DTO\VO\DO等除外,
2、類名的定義
(1)普通類名采用大寫字母開始;
(2)抽象類采用Abstract或Base開頭, 例子:普通類——class
UserModel,抽象類——abstract class AbstractUserDefinition等,
3、常量、型別、介面、子類的定義
(1)常量使用全大寫且單詞之間用"_“隔開; (2)boolean變數不能使用is開頭;
(3)介面盡量不要修飾符、子類緊跟介面追加Impl,
例子:常量——SORT_TYPE,布爾型別——flag,介面——UserService,實作類——UserServiceImpl等,
說明:常量不可組裝,需要原子性定義,不能出現"KEY”+SORT_TYPE這種內部出現,
4、包名、例外、列舉、方法名稱的定義
(1)包名一律采用小寫; (2)例外都采用_Exception結尾; (3)列舉都是以Enum結尾;
(4)方法名稱——根據方法內容采用如插入insert-*,
例子:例外——UserException,包名——com.test,列舉——UserEnum,方法名稱——insertUser等,
5、領域模型定義規范:主要是以VO\DTO\DO等結尾
例子:用戶資料——UserDTO等 ?(1)資料物件:xxxDO,xxx 即為資料表名,
?(2)資料傳輸物件:xxxDTO,xxx為業務領域相關的名稱, (3)展示物件:xxxVO,xxx一般為網頁名稱,
?(4)POJO是DO/DTO/BO/VO的統稱,禁止命名成xxxPOJO,
(二)代碼格式規范
1、括號代碼要求
左大括號前不換行、左大括號后換行、右大括號前換行、右大括號后還有else等代碼則不換行;表示終止的右大括號后必須換行,
如:
public static void main(String[] args) { String name = "test名稱"; if(name.equals("prod")){ System.out.println("prod 謹慎!"); }else if(name.equals("test")){ System.out.println("test 不刪服務器就行!"); }else{ System.out.println("別砸電腦就行!"); } }
2、括號中間的操作變數要有空格,左右括號不出現空格,
如:if(a == b)
3、注釋規范:注釋的雙斜線與注釋內容之間有且僅有一個空格
如:
// 變數作用
boolean switchTree = false;
4、行字符數限制不超過120個,超出需要換行,換行時遵循如下原則:
(1)第二行相對第一行縮進 4 個空格,從第三行開始,不再繼續縮進; ?
(2)運算子與下文一起換行;
?(3)方法呼叫的點符號與下文一起換行; ?
(4)方法呼叫中的多個引數需要換行時,在逗號后進行; ?
(5)在括號前不要換行, 例子:
StringBuilder sb = new StringBuilder(); // 超過 120 個字符的情況下,換行縮進 4 個空格,并且方法前的點號一起換行 sb.append(“A”).append(“B”)…
.append(“C”)…
.append(“D”)…
.append(“E”);
錯誤示例:
StringBuilder sb = new StringBuilder(); // 超過120個字符的情況下,不要在括號前換行,下面是違反(5)條
sb.append(“A”).append(“B”)…append
(“C”); // 引數很多的方法呼叫可能超過 120個字符,逗號后才是換行處,違反(3)條
method(s1, s2, s3, …
, argsX);
5、方法傳參中,多個引數之間要有空格,
例子:
private static void test1(String name, String user){
System.out.println(“test1”);
}
(三)java程式規范
1、重寫方法規范:重寫方法必須添加注解@Override避免方法名不一致
2、引數如果相同、含義也相同,使用可變引數替換逐個定義
3、不能使用過時的類或方法
4、Object的equals方法容易拋空指標例外,應使用常量或確定有值的物件來呼叫equals
如:“test”.equals(key)
5、所有整型包裝類物件之間值的比較,使用equals方法比較
原因:對于 Integer var = ?在-128至127之間的賦值,Integer物件是在
IntegerCache.cache產生,會復用已有物件,這個區間內的Integer值可以直接使用==進行判斷,但是這個區間之外的所有資料,都會在堆上產生,并不會復用已有物件,這是一個大坑,推薦使用equals方法進行判斷,
6、任何貨幣金額,均以最小貨幣單位且整型型別來進行存盤
如:10元 ->> 1000
7、浮點數之間的比較
浮點型的包裝類的比較不能使用equals,采用BigDecimal來實作,float基本型別不能使用==判定,采用誤差范圍之內相等,
(1) 指定一個誤差范圍,兩個浮點數的差值在此范圍之內,則認為是相等的,
float a = 1.0F - 0.9F; float b = 0.9F - 0.8F; float diff = 1e-6F; if (Math.abs(a - b) < diff) { System.out.println("true"); }
(2) 使用 BigDecimal 來定義值,再進行浮點數的運算操作,
BigDecimal a = new BigDecimal("11.0"); BigDecimal b = new BigDecimal("10.9"); BigDecimal x = a.subtract(b); if (x.compareTo(y) == 0) { System.out.println("true"); }
8、禁止使用構造方法BigDecimal(double)的方式把double值轉化為BigDecimal物件
原因:精度會損失, 正確例子:使用BigDecimal bg = BigDecimal.valueOf(double)進行初始化,
9、基本型別和包裝型別使用規范
(1)所有的POJO類屬性必須使用包裝資料型別;
?(2)RPC方法的回傳值和引數必須使用包裝資料型別;
?(3)所有的區域變數使用基本資料型別(推薦),
10、使用索引訪問用String的split方法得到的陣列時,需做最后一個分隔符后有無內容的檢查,否則會有拋IndexOutOfBoundsException的風險
例子:
String str = "a,b,c,e,"; String[] ary = str.split(","); // 預期為5,結果是4 System.out.println(ary.length);
(四)java注釋規范
1、類(抽象類)、類屬性、類方法的注釋
必須使用Javadoc規范,使用/*內容/格式,不得使用 //
xxx方式,在工程呼叫方法時,不進入方法即可懸浮提示方法、引數、回傳值的意義,提高閱讀效率,
2、所有的類都必須添加創建者和創建日期
在idea中File→Settings→Editor→File and Code
Templates→Files→Class中的include中添加: @author 為${USER} @date ${DATE};
3、方法內部單行注釋
在被注釋陳述句上方另起一行,使用// 注釋,方法內部多行注釋使用 /* */ 注釋,注意與代碼對齊,
4、在類中洗掉未使用的任何欄位、方法、內部類;在方法中洗掉未使用的任何引數宣告與內部變數
5、謹慎注釋掉代碼,在上方詳細說明,而不是簡單地注釋掉,如果無用,則洗掉
代碼被注釋掉:
(1)后續會恢復此段代碼邏輯,
(2)永久不用,假如需要查閱歷史代碼,登錄代碼倉庫即可,
6、特殊注釋標記,請注明標記人與標記時間,注意及時處理這些標記,通過標記掃描,經常清理此類標記,線上故障有時候就是來源于這些標記處的代碼
(1)待辦事宜(TODO):(標記人,標記時間,[預計處理時間])表示需要實作,但目前還未實作的功能, 是一個Javadoc的標簽,目前的
Javadoc 還沒有實作,但已經被廣泛使用,只能應用于類,介面和方法(因為它是一個 Javadoc 標簽),
(2)錯誤,不能作業(FIXME):(標記人,標記時間,[預計處理時間])在注釋中用FIXME標記某代碼是錯誤的,而且不能作業,需要及時糾正的情況,
(五)java控制陳述句
1、switch括號內的變數型別為String并且此變數為外部引數時,必須先進行null判斷
原因是:
switch中的引數如果是null,則不進行陳述句string任何case,
說明:switch中的case都需要有default(強制),
2、在if/else/for/while/do陳述句中必須使用大括號,
如:
if(t1 == t2){
System.out.println(“*************”);
}
3、三目運算子值規范,
condition ? 運算式 1 : 運算式 2 中,高度注意運算式1和2在型別對齊時,可能拋出因自動拆箱導致的NPE,
4、在高并發場景中,避免使用”等于”判斷作為中斷或退出的條件,
說明:并發控制不好,會導致無法中斷,如判斷==0退出回圈,并發會導致負數,中斷不了回圈,
5、表達例外的分支時,少用if-else方式,
例子:
if (condition) { ... return obj; } //邏輯代碼
6、不要在其它運算式(尤其是條件運算式)中,插入賦值陳述句,
如:jdk原始碼中的HashMap中put方法,
7、不要在條件判斷中執行其它復雜的陳述句,將復雜邏輯判斷的結果賦值給一個有意義的布爾變數名,以提高可讀性,
正確例子:
作者:大碼王 出處:https://www.cnblogs.com/huanghanyu/final boolean existed = (file.open(fileName, "w") != null) && (...) || (...); if (existed) { ... }
-------------------------------------------
個性簽名:獨學而無友,則孤陋而寡聞,做一個靈魂有趣的人!
如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,博主在此感謝!
萬水千山總是情,打賞一分行不行,所以如果你心情還比較高興,也是可以掃碼打賞博主,哈哈哈(っ??ω??)っ???!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548555.html
標籤:Java
上一篇:有了HTTP,為啥還要用RPC
下一篇:初識java
