阿里巴巴泰山版《Java 開發者手冊》,也是一份防坑指南
阿新 • • 發佈:2020-05-12
> 我是風箏,公眾號「古時的風箏」,一個不只有技術的技術公眾號,一個在程式圈混跡多年,主業 Java,另外 Python、React 也玩兒的 6 的斜槓開發者。
Spring Cloud 系列文章已經完成,可以到 [我的github](https://github.com/huzhicheng/spring-cloud-study) 上檢視系列完整內容。也可以在公眾號內回覆「pdf」獲取我精心製作的 pdf 版完整教程。
4月22日,阿里巴巴釋出了泰山版《Java 開發手冊》,以前以為**終極版**就真的是終極版了,沒想到還是想的太簡單了,繼終極版之後又釋出了詳盡版、華山版,這不,泰山版又來了。想想也對,行業一直在發展,JDK 也一直在更新,怎麼可能有終極版。
![](https://imgkr.cn-bj.ufileos.com/dc79cb54-3dab-406c-bf7c-e49e9f945544.png)
自從2017年阿里釋出終結版釋出以來,我就把這個手冊當做開發規範使用,放在電腦中最顯眼的地方,時不時就翻出來看一看,並且在團隊中推廣,還順便安利給了一些朋友。每次有新版本釋出都第一時間拿下來再重新讀一遍。
本次泰山版釋出,對比上一版本有如下幾個更新:
1. 釋出錯誤碼統一解決方案。
2. 新增 34條新規約,比如,日期時間的閏年、閏月問題,三目運算的自動拆箱,SQL 查詢的表別名限定,Collectors 類的 toMap()方法使用注意等。
3. 修改描述 90處,比如,阻塞等待鎖、建表的小數型別等。
4. 完善若干處示例,比如,ISNULL 的示例等 。
## 為什麼要經常拿出來讀一讀呢?
![](https://imgkr.cn-bj.ufileos.com/d01bc474-234c-4a53-8c00-cf1668ec5e7e.png)
手冊涉及從專案設計到編碼、部署的各個方面。但是對於開發者個人來說,有些方面其實不常接觸,比如併發控制有很多人接觸的機會有限。再比如異常定義、MySQL 管理,可能是專案開始的時候被核心開發人員或者架構師統一定製好了,有些同學也就直接拿來主義了,也不關心具體的設計原理和實現細節。
手冊也不長,這一版正文只有 57 頁,讀一遍也花不了多長時間。其中有些方面是我們平時也經常說到的,比如命令風格、常量定義等,也有一些方面可能平時就沒那麼注意了,比如註釋規約,註釋怎麼寫,寫在哪裡,什麼格式。不誇張的說,很多時候,能寫註釋的都已經很不錯了, 更不要說把註釋寫清楚,甚至有很多人根本就不怎麼寫註釋,覺得這是浪費時間。
這個手冊是阿里巴巴多年開發經驗的結晶,除了上面說到的命名、註釋等提升程式碼可讀性、易讀性的規約,還包括了正確的建表、良好的工程結構、良好的異常處理、安全控制,還有一些平時常用 JDK 功能的防坑指南。
### 命名風格、常量定義、程式碼格式
這幾個基本上寫過幾年程式碼的都會有一套差不多的規範,基本上和阿里巴巴開發者手冊相差無幾。
### OOP 規約
**6.【強制】Object的equals方法容易拋空指標異常,應使用常量或確定有值的物件來呼叫equals。**
> 正例:"test".equals(object);
> 反例:object.equals("test");
> 說明:推薦使用 java.util.Objects#equals(JDK7 引入的工具類)。
反例中的 object 是一個變數,並且這個變數為 null,就會丟擲異常。推薦使用 Objects.equals(s1, s2)。
**8. 【強制】任何貨幣金額,均以最小貨幣單位且整型型別來進行儲存。**
比如說人民幣的最小單位是分,那假設一個商品的價格是1元錢,那就存到資料庫的 price 欄位,欄位型別是 int 或者 bigint,值為 100,單位是分,也就是100分。
我就在這個問題上入過坑,幾年前一個系統中的價格欄位用的是浮點數,單位還是元,後面在價格計算上很是麻煩,而且浮點數的計算並不是完全準確的,尤其是涉及到小數位的時候。最後還是把欄位調成了 int 型別,程式碼上涉及到價格的地方都重構了。
所以,後來當我看到手冊中的這條規約的時候,有種相見恨晚的感覺。我用了慘痛的經驗才換來這個教訓,如果早點看到呢,豈不是省了很多事。
**9. 【強制】浮點數之間的等值判斷,基本資料型別不能用==來比較,包裝資料型別不能用 equals 來判斷。**
反例:
```java
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
if (a == b) {
// 預期進入此程式碼快,執行其它業務邏輯 // 但事實上 a==b 的結果為 false
}
Float x = Float.valueOf(a);
Float y = Float.valueOf(b);
if (x.equals(y)) {
// 預期進入此程式碼快,執行其它業務邏輯
// 但事實上 equals 的結果為 false
}
```
沒寫過浮點數計算之前,覺得這不就是數學計算嗎,計算機最高出來不就是為了幹這個的嗎。直到接觸了浮點數計算才發現和想象的完全不一樣,就像上面的反例那樣,原因是計算機採用二進位制,沒辦法完全精確的表示十進位制,有興趣的同學可以搜一搜,瞭解一下背後原理。
正確的做法是用高精度的 BigDecimal,它的目的就是用來做浮點數做不來的高精度計算的。
### 日期格式
有好多同學對於日期的處理都不是很熟悉,經常好久不用,用到了就去網上查,其實我也不常用,要讓我現在手寫一個日期處理的方法也得查 API,為此專門寫了一個日期處理工具類。但是注意要及時升級,比如 JDK 8 之後出的 LocalDateTime 就可以替換之前的 Date 了。
手冊中還專門提到了**【強制】不允許在程式任何地方中使用:1)java.sql.Date2)java.sql.Time3) java.sql.Timestamp**,趕緊翻翻你的程式碼中是不是還在用這三個型別,反正我已經在用 LocalDateTime。
### 集合處理
集合使我們開發中使用頻率非常高的資料結構,建議每一條都仔細閱讀,然後應用到我們的專案中。這哪裡是開發手冊,這是在告訴我們如何正確的使用Java 集合。
### 併發處理
如何正確的使用執行緒池、SimpleDateFormat 不是執行緒安全的、正確的使用 ThreadLocal。每一條背後都是經驗教訓。
### 異常處理
try-catch 如何使用、同一模組如何處理異常、不同服務如何處理異常等等。
### MySQL
如何建表、何時分表,如何命名錶名、欄位名,合適的選擇欄位型別,如何建立索引、良好的 SQL 語句,ORM 對映,每一條都能深挖下去。
### 工程結構
專案標準的分層結構是怎麼樣的,依賴庫的管理方式,伺服器的重點調優指標等等。
### 設計規約
從架構師的角度規範一個專案文件編寫、設計過程等等。
### 錯誤碼
錯誤碼用來友好的反應邏輯問題或者系統錯誤。每個平臺都應該有且僅有一份錯誤碼,不能多也不能少。在手冊最後還公佈了一份完整的錯誤碼列表。
能一次性把手冊讀明白的,那絕對是高手了,大多數人可能對其中的一部分規約不太理解。但其實這些都是基礎的內容,所以說,看那些雲山霧罩的面試寶典之前,先把這個手冊完全搞明白,那對你的程式設計水平也會有很大提高。
## 阿里巴巴編碼規範 IDEA 外掛
阿里巴巴還出了一個開發規約的 IDEA 外掛,配合開發手冊就完美了。可以在 IDEA 外掛管理介面搜尋"Alibaba Java Code Guidelines"進行安裝。
![](https://imgkr.cn-bj.ufileos.com/8c044cf5-326f-46cf-9536-848ff9881dd8.png)
![](https://imgkr.cn-bj.ufileos.com/184e99cc-a34b-479c-aadc-5d1187548810.png)
之後在 IDEA 的 tools 選單下可以看到這個外掛,有動態開啟或者關閉,還可以切換語言。
![](https://imgkr.cn-bj.ufileos.com/446016ed-8afe-4204-89c9-5da32e4ad7d8.png)
開啟之後,當我們在程式碼裡寫了違反規約的程式碼時,就會給出提示,比如我在程式碼裡用 `==`比較兩個 Integer,就會在 `==`下面出現警告提示,並且告訴你正確的姿勢是什麼。
![](https://imgkr.cn-bj.ufileos.com/75a1d372-7c62-4afb-80a1-e7d0a93bd06c.png)
## 手冊下載
沒有下載的同學趕緊下載下來讀兩遍吧。
**官方下載地址**,需要登入阿里雲。
[https://developer.aliyun.com/topic/java2020](https://developer.aliyun.com/topic/java2020)
**沒有阿里雲的同學,在公眾號內回覆「阿里」,獲取下載地址**
-----------------------
> 我是風箏,公眾號「**古時的風箏**」,一個在程式圈混跡多年,主業 Java,另外 Python、React 也玩兒的很 6 的斜槓開發者。可以在公眾號中加我好友,進群裡小夥伴交流學習,好多大廠的同學也在群內呦。
**技術交流還可以加群或者直接加我微信。**
![](https://img2020.cnblogs.com/blog/273364/202004/273364-20200429181853069-4162798