1. 程式人生 > >阿里巴巴泰山版《Java 開發者手冊》,也是一份防坑指南

阿里巴巴泰山版《Java 開發者手冊》,也是一份防坑指南

> 我是風箏,公眾號「古時的風箏」,一個不只有技術的技術公眾號,一個在程式圈混跡多年,主業 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