1. 程式人生 > 其它 >Java開發之規範

Java開發之規範

1.顯示宣告UID

所有可序列化類都顯示宣告serialVersionUID值,若不顯示宣告,系統會預設生成一個UID,這樣在這個物件進行序列化與反序列的時候,如果對​java培訓​象新增一個屬性或者刪除一個屬性,那麼預設的UID也會發生改變,也就會導致反序列化時候就會出現: java.io.InvalidClassException

案例分析

建立一個Person類,定義兩個屬性name,age。通過redis進行快取物件序列化後的byte[]。然後在修改Person類屬性,增加或刪除一個屬性,比如增加一個address屬性。再反序列之前儲存在redis快取的byte[]。會出現反序列化失敗(ps:這邊只是演示效果)

public class UIDTest {

public static void main(String[] args) {

try {

//第一步儲存序列化後的物件

Person person = new Person("jack2", 21);

RedisUtils.stringSetBit("jack2", serializeObj(person));

//第二步,增加修改Person類屬性,進行反序列化

Person p1 = (Person) deserialize(RedisUtils.byteGet("jack2"));

System.out.println(p1);

} catch (Exception ex) {

ex.printStackTrace();

}

}

public static byte[] serializeObj(Object obj) {

try (ByteArrayOutputStream os = new ByteArrayOutputStream(); ObjectOutputStream ot = new ObjectOutputStream(os)) {

ot.writeObject(obj);

return os.toByteArray();

} catch (IOException ex) {

ex.printStackTrace();

}

return null;

}

public static Object deserialize(byte[] bytes) {

try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); ObjectInputStream objectInputStream = new ObjectInputStream

(inputStream)) {

return objectInputStream.readObject();

} catch (Exception ex) {

ex.printStackTrace();

}

return null;

}

}

  • idea建立設定,開啟缺少UID提示

2.校驗包裝型別是否為null

Java引入包裝型別是為了解決基本型別無法例項化的問題,便於讓一個基本型別也能參加到面向物件的程式設計世界中。由於包裝型別的預設值是null,所以為了防止萬惡的java.lang.NullPointerException錯誤,所以在使用包裝型別時候,必須要校驗包裝型別是否為null

提示

  • 【強制】所有的POJO類屬性必須使用包裝資料型別
  • 【強制】RPC方法的返回值和引數必須使用包裝資料型別
  • 【推薦】所有的區域性變數使用基本資料型別

3.用BigDecimal表示金額

java.math.BigDecimal是專門為了彌補浮點型無法精確計算的缺憾而設計的類,並且它本身也提供了加減乘除的常用數學演算法。特別是與資料庫Decimal型別的欄位對映的。而如果是財務運算,更加應該使用BigDecimal型別來表示金額。並且儘量使用String型別的建構函式。

4.POJO類覆寫toString()

覆寫POJO類的toString(),因為Java提供的預設的toString方法不友好,打印出來看不懂。尤其在實際開發過程中,當方法丟擲異常的時候,呼叫下POJO的toString()方法打印出屬性值。便於問題排查。推薦使用:apache的commons工具包中ToStringBuilder類

5.工具類不可例項化

實際專案中,避不可免,要寫一些Utils類。但是在寫這些工具類的時候,要讓工具類不可例項化。因為這些工具類只是提供了一些通用的非業務領域的公用方法,沒有額外的屬性,我們僅僅呼叫定義的方法。所以沒有必須讓其例項化。

  • 優秀程式碼欣賞

6.優先使用StringBuilder

在頻繁進行字串的運算(如拼接、替換、刪除等),優先考慮StringBuilder,如SQL語句的拼裝、Json的封裝等等。

7.指定集合的初始化大小

我們在使用ArrayList、HashMap等集合的時候,一般都是直接: ArrayListstrs = new ArrayList<>();然後進行add、remove等方法進行操作,因為在它的特性就是動態管理長度的。所以我們無須擔心超出長度的問題。但是為了寫出高效的程式碼,必須明確指出集合初始化大小。

  • 原始碼檢視

8.資源物件、流物件及時回收

對於資料庫資源、檔案操作、流操作需要及時進行close。Java7以上,可以使用語法:try-with-resources可以實現自動關閉資源物件。

9.用ThreadPoolExecutor建立執行緒池

在實際開發中,在處理多工的情況下,通常想到為了節約處理時間,需要使用多執行緒技術來縮短時間。那麼在編寫高質量Java程式碼,需要使用ThreadPoolExecutor來顯示建立執行緒池。

10.讓註釋正確、清晰、簡潔

  • 1.類、屬性、方法的註釋必須使用Javadoc規範,使用/*xxx/格式
  • 2.所有抽象方法(包括介面方法)除了返回值、引數、異常還需要要指出該方法做什麼事情,實現什麼功能
  • 3.所有的類必須新增建立者和建立日期
  • 4.方法內的註釋必須在被註釋語句的上方,不能跟在註釋語句後面
  • 5.所有列舉型別必須要有註釋,說明每個資料項的用途