阿里巴巴泰山版《Java 開發者手冊》,也是一份防坑指南
我是風箏,公眾號「古時的風箏」,一個不只有技術的技術公眾號,一個在程式圈混跡多年,主業 Java,另外 Python、React 也玩兒的 6 的斜杠開發者。
Spring Cloud 系列文章已經完成,可以到 我的github 上查看系列完整內容。也可以在公眾號內回復「pdf」獲取我精心製作的 pdf 版完整教程。
4月22日,阿里巴巴發布了泰山版《Java 開發手冊》,以前以為終極版就真的是終極版了,沒想到還是想的太簡單了,繼終極版之後又發布了詳盡版、華山版,這不,泰山版又來了。想想也對,行業一直在發展,JDK 也一直在更新,怎麼可能有終極版。
自從2017年阿里發布終結版發布以來,我就把這個手冊當做開發規範使用,放在電腦中最顯眼的地方,時不時就翻出來看一看,並且在團隊中推廣,還順便安利給了一些朋友。每次有新版本發布都第一時間拿下來再重新讀一遍。
本次泰山版發布,對比上一版本有如下幾個更新:
- 發布錯誤碼統一解決方案。
- 新增 34條新規約,比如,日期時間的閏年、閏月問題,三目運算的自動拆箱,SQL 查詢的表別名限定,Collectors 類的 toMap()方法使用注意等。
- 修改描述 90處,比如,阻塞等待鎖、建表的小數類型等。
- 完善若干處示例,比如,ISNULL 的示例等 。
為什麼要經常拿出來讀一讀呢?
手冊涉及從項目設計到編碼、部署的各個方面。但是對於開發者個人來說,有些方面其實不常接觸,比如並發控制有很多人接觸的機會有限。再比如異常定義、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 來判斷。
反例:
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”進行安裝。
之後在 IDEA 的 tools 菜單下可以看到這個插件,有動態開啟或者關閉,還可以切換語言。
開啟之後,當我們在程式碼里寫了違反規約的程式碼時,就會給出提示,比如我在程式碼里用 ==
比較兩個 Integer,就會在 ==
下面出現警告提示,並且告訴你正確的姿勢是什麼。
手冊下載
沒有下載的同學趕緊下載下來讀兩遍吧。
官方下載地址,需要登錄阿里雲。
//developer.aliyun.com/topic/java2020
沒有阿里雲的同學,在公眾號內回復「阿里」,獲取下載地址
我是風箏,公眾號「古時的風箏」,一個在程式圈混跡多年,主業 Java,另外 Python、React 也玩兒的很 6 的斜杠開發者。可以在公眾號中加我好友,進群里小夥伴交流學習,好多大廠的同學也在群內呦。
技術交流還可以加群或者直接加我微信。