致全球Java開發者:數據庫
代碼是二進制世界的交流方式,極致的代碼是咱們的榮耀。編程
2017年春天,《阿里巴巴Java開發手冊》發佈,咱們但願在涵蓋編程規約、異常日誌、單元測試、安全規約、MySQL數據庫、工程規約、設計規約等7個維度上爲開發工做提供一點幫助。設計模式
目前已有超過260萬位工程師下載及查閱手冊,在數以千計的企業應用,手冊成爲受業界承認的開發規範。咱們也有幸爲全行業的研發效能、人才培養、系統穩定性做出力所能及的一點貢獻。數組
兩年來,Java開發者們熱心參與,以幫助這本不夠完美的手冊日臻完善。曾有開發者追蹤問題長達半年之久,反覆探討、論證其正確性。這樣的開發者難以計數,也許相隔重洋,可能相逢不識,咱們用代碼確認一致的熱愛,也讓這本手冊的價值超越了單一公司。安全
所以,咱們決定將手冊正式改名爲《Java開發手冊》,它屬於全部參與其中的貢獻者,也以此聊表咱們對全球Java開發者的感謝。併發
同時在今天,時隔一年,《Java開發手冊》正式推出更新版,涵蓋前所未有的三大升級:高併發
1.新增21條新規約。好比,switch的空指針問題、浮點數的比較、無泛型限制引發的類型混亂、加鎖與解鎖的注意事項、YYYY的日期格式問題等;單元測試
2.修改描述112處。好比,IFNULL的判斷方式、集合的toArray的數組長度、日誌佔位符的處理等;測試
3.完善若干處示例。好比,變量命名示例、衛語句示例、枚舉示例、finally的return示例等。阿里雲
如何免費下載?
掃描上方二維碼
免費下載《Java開發手冊》最新版
新版手冊有哪些值得關注的亮點?
首先是關於新增的21條故障相關的規範,所有源於業界經典事實故障,通過廣大開發者深度討論提煉而成。表面看似簡單,實質是直擊代碼靈魂的考究,惟有內功深厚之人方能看透底層。隨手列舉其中三條,一塊兒來感覺下:
1.Lock 鎖的使用每每稍微不注意,可能致使死鎖的問題。
在使用阻塞等待獲取鎖的方式中,必須在 try 代碼塊以外,而且在加鎖方法與 try 代碼塊之間沒有任何可能拋出異常的方法調用,避免加鎖成功後,在 finally 中沒法解鎖。
若是在 lock 方法與 try 代碼塊之間的方法調用拋出異常,那麼沒法解鎖,形成其它線程沒法成功獲取鎖。若是 lock 方法在 try 代碼塊以內,可能因爲其它方法拋出異常,致使在 finally代碼塊中,unlock 對未加鎖的對象解鎖,它會調用 AQS 的 tryRelease 方法(取決於具體實現類),拋出 IllegalMonitorStateException 異常。在 Lock 對象的 lock方法實現中可能拋出 unchecked 異常。而在使用嘗試機制來獲取鎖的方式中,好比 tryLock(),在進入業務代碼塊以前,必須先判斷當前線程是否持有鎖。
鎖的釋放規則與鎖的阻塞等待方式相同。Lock 對象的 unlock 方法在執行時,它會調用 AQS 的 tryRelease 方法(取決於具體實現類),若是當前線程不持有鎖,則拋出 IllegalMonitorStateException 異常。
2.switch 的 NPE 問題。
當 switch 括號內的變量類型爲 String 而且此變量爲外部參數時,必須先進行 null 判斷。以下的代碼輸出是什麼?
publicclass SwitchString {publicstaticvoidmain(String[] args){method(null);}publicstaticvoidmethod(String param){switch(param){// 確定不是進入這裏case"sth":System.out.println("it's sth");break;// 也不是進入這裏case"null":System.out.println("it's null");break;// 也不是進入這裏default:System.out.println("default");}}}
3.浮點數的比較問題。
1-0.9=0.1是天經地義的,但在計算機的世界裏,0.1偏偏是沒法精確表示的一個小數,只有2的冪次倍小數纔可以精確表示,如:0.五、0.2五、0.125等。因爲0.1是近似表達,在各類情形中的計算存在數位的取捨精度不同,因此1-0.9未必等於0.9-0.8,因此浮點數之間的等值判斷,基本數據類型不能用==來比較,包裝數據類型不能用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)) {// 預期進入此代碼塊,執行其它業務邏輯// 可是 x.equals(y) 的結果爲false}
《Java開發手冊》自始至終不是最完美的,可是有了業界全部開發者的關注與支持,咱們相信它在一步步走向完美。在廣大開發者的建議下,這次「華山版」修正了過往歷史版本的兩個錯誤。
1.集合轉數組時的傳入數組的空間設置。有讀者追蹤這個問題長達半年之久,你們能夠到P3C的ISSUE裏找到關於這段論戰的歷史軌跡。他指出,toArray 的數組長度必須設置爲0。後來咱們發如今高併發狀況下,他的說法是對的。
2.關於 ScheduleService 的刪除。關於這個方法建立線程池,雖然能夠模仿出來它的 OOM 狀況,可是找遍 JDK 沒有任何替代的方式。因此咱們回到它的原點問題上,深刻地思考會不會有人使用 ScheduleService 的方式,不斷地加入隊列中呢?它是一個定時執行的線程池,這種操做方式是否是過於暴力、爲賦新詞強說愁?權衡之下,最後新版手冊去掉這條規約的檢測。
爲了讓更多基礎入門的開發者能更快、準確理解規約背後的思路,這次新版也對部分略顯艱澀的示例作了更生動的解釋。以貼合實際生活場景的視角,幫助讀者理解代碼世界中的邏輯原理。
好比,關於衛語句的說明,原來的例子理解起來是有難度的,修正爲從女孩子相親的視角來看待。在嵌套語句的要求中,若是非得使用 if()…else if()…else…方式表達邏輯,請勿超過3層,超過請使用狀態設計模式。超過3層的 if-else 的邏輯判斷代碼可使用衛語句、策略模式、狀態模式等來實現,其中衛語句示例以下:
public class GuardSatementsDemo{public void findBoyfriend(Man man) {if(man.isBadTemper()) {System.out.println(「月球有多遠,你就給我滾多遠.」);return;}if (man.isShort()) {System.out.println(「我不須要武大郎同樣的男朋友.」);return;}if (man.isPoor()) {System.out.println(「貧賤夫妻百事哀.」);return;}System.out.println(「能夠先交往一段時間看看.」);}}
特別感謝過去兩年中爲《Java開發手冊》提供過寶貴意見與建議的全部開發者,大家是讀者,更是做者,這份榮譽屬於大家!
One more thing,週一Java測試題的正確答案爲「BBBCB」,你們能夠在手冊新版中找到解題思路。此外,6月27日,咱們誠摯地邀請你與做者孤盡暢聊新版背後的故事,詳解題目深意,並有多本Java好書相贈。
歡迎點擊「閱讀原文」,訪問阿里雲開發者社區,預定直播,下週三咱們不見不散~
小彩蛋來啦!
對於時隔一年發佈的《Java開發手冊》最新版,你有哪些感想或建議?歡迎在留言區討論分享,咱們將挑選5位最用心的同窗送出《碼出高效》技術好書。
下載地址: