我是風箏,公衆號「古時的風箏」。 文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裏面。java
4月22日,阿里巴巴發佈了泰山版《Java 開發手冊》,之前覺得終極版就真的是終極版了,沒想到仍是想的太簡單了,繼終極版以後又發佈了詳盡版、華山版,這不,泰山版又來了。想一想也對,行業一直在發展,JDK 也一直在更新,怎麼可能有終極版。git
自從2017年阿里發佈終結版發佈以來,我就把這個手冊當作開發規範使用,放在電腦中最顯眼的地方,時不時就翻出來看一看,而且在團隊中推廣,還順便安利給了一些朋友。每次有新版本發佈都第一時間拿下來再從新讀一遍。程序員
本次泰山版發佈,對比上一版本有以下幾個更新:github
- 發佈錯誤碼統一解決方案。
- 新增 34條新規約,好比,日期時間的閏年、閏月問題,三目運算的自動拆箱,SQL 查詢的表別名限定,Collectors 類的 toMap()方法使用注意等。
- 修改描述 90處,好比,阻塞等待鎖、建表的小數類型等。
- 完善若干處示例,好比,ISNULL 的示例等 。
爲何要常常拿出來讀一讀呢?
手冊涉及從項目設計到編碼、部署的各個方面。可是對於開發者我的來講,有些方面其實不常接觸,好比並發控制有不少人接觸的機會有限。再好比異常定義、MySQL 管理,多是項目開始的時候被核心開發人員或者架構師統必定製好了,有些同窗也就直接拿來主義了,也不關心具體的設計原理和實現細節。面試
手冊也不長,這一版正文只有 57 頁,讀一遍也花不了多長時間。其中有些方面是咱們平時也常常說到的,好比命令風格、常量定義等,也有一些方面可能平時就沒那麼注意了,好比註釋規約,註釋怎麼寫,寫在哪裏,什麼格式。不誇張的說,不少時候,能寫註釋的都已經很不錯了, 更不要說把註釋寫清楚,甚至有不少人根本就不怎麼寫註釋,以爲這是浪費時間。sql
這個手冊是阿里巴巴多年開發經驗的結晶,除了上面說到的命名、註釋等提高代碼可讀性、易讀性的規約,還包括了正確的建表、良好的工程結構、良好的異常處理、安全控制,還有一些平時經常使用 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,就會在 ==
下面出現警告提示,而且告訴你正確的姿式是什麼。
手冊下載
沒有下載的同窗趕忙下載下來讀兩遍吧。
官方下載地址,須要登陸阿里雲。
https://developer.aliyun.com/topic/java2020
沒有阿里雲的同窗,在公衆號內回覆「阿里」,獲取下載地址
送給你
種一棵樹最好的時間是十年前,其次是如今。送給各位,也送給本身。
公衆號「古時的風箏」,Java 開發者,全棧工程師,人稱遲到小王子,bug 殺手,擅長解決問題。 一個兼具深度與廣度的程序員鼓勵師,本打算寫詩卻寫起了代碼的田園碼農!堅持原創乾貨輸出,你可選擇如今就關注我,或者看看歷史文章再關注也不遲。長按二維碼關注,跟我一塊兒變優秀!