《码出高效-阿里巴巴Java开发手册-泰山版》阿里最新出品的泰山版Java开发手册,告别垃圾代码
文章目錄
- 前言
- 發(fā)布錯(cuò)誤碼統(tǒng)一解決方案
- 新增 34 條新的規(guī)約
- 1)日期時(shí)間
- 2)三目運(yùn)算的 NPE 問(wèn)題
- 3)Collectors 類的 toMap() 方法
- 修改描述 90 處
- 完善若干處示例
- 最后
前言
東岳泰山;西岳華山;南岳衡山;北岳恒山;中岳嵩山
其中以東岳泰山為首,而這本阿里出品的泰山版 Java 開(kāi)發(fā)手冊(cè)經(jīng)過(guò)阿里巴巴技術(shù)團(tuán)隊(duì)的集體智慧結(jié)晶和經(jīng)驗(yàn)總結(jié),經(jīng)歷了多次大規(guī)模一線實(shí)戰(zhàn)的檢驗(yàn)及不斷的完善,系統(tǒng)化地整理成冊(cè),是迄今為止最重量級(jí)的。
新版都更新了哪些內(nèi)容呢?可以從官方的版本歷史中看得出來(lái)。
發(fā)布錯(cuò)誤碼統(tǒng)一解決方案
錯(cuò)誤碼用來(lái)干嘛呢?答案是異常日志,方便我們快速知曉錯(cuò)誤來(lái)源,判斷是誰(shuí)那出的問(wèn)題。
- 上圖中 A 表示錯(cuò)誤來(lái)源于用戶;
- 還有 B 級(jí)的,表示錯(cuò)誤來(lái)源于當(dāng)前系統(tǒng);
- C 級(jí)的,表示錯(cuò)誤來(lái)源于第三方服務(wù),比如 CDN 服務(wù)器。
這個(gè)解決方案還是值得借鑒的,很多成熟的系統(tǒng)都在使用錯(cuò)誤碼,如果你對(duì)接過(guò)微信支付的話,應(yīng)該對(duì)錯(cuò)誤碼不會(huì)感到陌生。看到錯(cuò)誤碼,然后在手冊(cè)中搜索一下,就能快速知曉錯(cuò)誤的類型,還是很不錯(cuò)的。
點(diǎn)擊此處免費(fèi)領(lǐng)取手冊(cè),暗號(hào)csdn
新增 34 條新的規(guī)約
34 條太多了,我就挑幾個(gè)重要的拉出來(lái)說(shuō)一說(shuō)吧。
1)日期時(shí)間
還記得之前技術(shù)圈的刷屏事件吧?就是那個(gè) YYYY 和 yyyy 造成的問(wèn)題。大寫的 Y 表示的是當(dāng)天所在的這一周是屬于哪個(gè)年份的,小寫的 y 表示的是當(dāng)天所在的年份,差別還是挺大的。你品,你細(xì)品。
還有,大寫的 M 和 小寫的 m 是不同的,大寫的 H 和小寫的 h 也是不同的。
另外,像獲取當(dāng)前毫秒數(shù)應(yīng)該使用 System.currentTimeMillis(),而不是 new Date().getTime(),這些細(xì)致的規(guī)約,都應(yīng)該牢記在心中,不要去犯這些低級(jí)的錯(cuò)誤。
2)三目運(yùn)算的 NPE 問(wèn)題
說(shuō)實(shí)話,這個(gè)問(wèn)題我之前從來(lái)沒(méi)有注意,這次看到了,就一起來(lái)學(xué)習(xí)一下。先來(lái)看下面這段代碼:
public class TestCondition {public static void main(String[] args) {Integer a = 1;Integer b = 2;Integer c = null;Boolean flag = false;Integer result = flag ? a * b : c;} }條件 a * b 屬于算術(shù)運(yùn)算,它倆相乘后的結(jié)果是一個(gè) int 類型,這就會(huì)導(dǎo)致 c 這個(gè) Integer 類型自動(dòng)拆箱,由于值為 null,就拋出了以下錯(cuò)誤:
Exception in thread "main" java.lang.NullPointerExceptionat com.cmower.mkyong.TestCondition.main(TestCondition.java:9)那可能你會(huì)感到好奇,為什么兩個(gè) Integer 類型的變量相乘后會(huì)是一個(gè) int 類型呢,這主要是由編譯器決定的,它就是這么設(shè)計(jì)的,來(lái)看一下反編譯后的字節(jié)碼:
public class TestCondition {public static void main(String args[]){Integer a = Integer.valueOf(1);Integer b = Integer.valueOf(2);Integer c = null;Boolean flag = Boolean.valueOf(false);Integer result = Integer.valueOf(flag.booleanValue() ? a.intValue() * b.intValue() : c.intValue());} }a * b 時(shí)發(fā)生了自動(dòng)拆箱,調(diào)用了 intValue() 方法,而三元運(yùn)算的兩個(gè)表達(dá)式的類型必須一致,這就導(dǎo)致 c 也調(diào)用了 intValue() 方法,由于 c 本身為 null,那就只能 NPE 了。明白了吧?
3)Collectors 類的 toMap() 方法
手冊(cè)上說(shuō),在使用 java.util.stream.Collectors 類的 toMap() 方法轉(zhuǎn) Map 時(shí),一定要使用含有參數(shù)類型為 BinaryOperator,參數(shù)名為 mergeFunction 的方法,否則當(dāng)出現(xiàn)相同 key 值時(shí)會(huì)拋出 IllegalStateException 異常。
這段話可能理解上有點(diǎn)難度,那先來(lái)看一段代碼吧!
運(yùn)行這段代碼的時(shí)候,就會(huì)拋出異常,堆棧信息如下所示:
Exception in thread "main" java.lang.IllegalStateException: Duplicate key 867758096 (attempted merging values 蕓蕓and 蕓蕓)at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:133)at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:180)key 重復(fù)了,因?yàn)閮蓚€(gè)“蕓蕓”的 hashCode 相同,那這時(shí)候的解決辦法呢?
String[] departments = new String[] {"蕓蕓", "蕓蕓", "蕓蕓"}; Map<Integer, String> map = Arrays.stream(departments).collect(Collectors.toMap(String::hashCode, str -> str, (v1, v2) -> v2));多加個(gè)參數(shù) (v1, v2) -> v2,也就是重復(fù)的時(shí)候選一個(gè)。來(lái)看看此時(shí)調(diào)用的 toMap() 方法吧。
public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction) {return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new); }BinaryOperator 和 mergeFunction 是不是出現(xiàn)了?
點(diǎn)擊此處免費(fèi)領(lǐng)取手冊(cè),暗號(hào)csdn
修改描述 90 處
手冊(cè)上說(shuō),比如,阻塞等待鎖、建表的小數(shù)類型等描述有修改,我特么花了半個(gè)小時(shí)也沒(méi)有找出來(lái)和上一個(gè)版本之間的差別。
不知道是不是手冊(cè)的小編在瞎說(shuō),你要是能發(fā)現(xiàn)差別,告訴我一聲。
點(diǎn)擊此處免費(fèi)領(lǐng)取手冊(cè),暗號(hào)csdn
完善若干處示例
比如說(shuō) SQL 語(yǔ)句欄目里的 ISNULL 的示例,確實(shí)比華山版追加了一個(gè)更詳細(xì)的反例,見(jiàn)下圖。
但說(shuō)實(shí)話,這段反例的描述我看了至少六遍才搞懂是什么意思。首先,不要在 null 前換行,影響閱讀性,這倒是真的;其次呢,不要使用 column is null 進(jìn)行判空,使用 ISNULL(column) 判空,效率更高,也不會(huì)出現(xiàn)換行的情況。
最后
2016 年 12 月份,阿里首次向業(yè)界開(kāi)放了這份《Java 開(kāi)發(fā)手冊(cè)》,到泰山版發(fā)布,已經(jīng)過(guò)去了 3 年多時(shí)間了,這份手冊(cè)也在全球 Java 開(kāi)發(fā)者共同的努力下,成為業(yè)界普遍遵循的開(kāi)發(fā)規(guī)范。這份手冊(cè)包含的知識(shí)點(diǎn)非常全面,七大維度編程規(guī)約、異常日志、單元測(cè)試、安全規(guī)約、MySQL數(shù)據(jù)庫(kù)、工程規(guī)約、設(shè)計(jì)規(guī)約都有羅列。
如果你想成為一名優(yōu)秀的 Java 工程師,那么這份手冊(cè)上的內(nèi)容幾乎是必須要掌握的。如果你手上還沒(méi)有這份手冊(cè),可以點(diǎn)擊此處免費(fèi)領(lǐng)取,暗號(hào)csdn。已經(jīng)有了的程序員,請(qǐng)忽略。最后,我衷心地祝福你,希望你能學(xué)有所成,加油!
需要此文檔的可以點(diǎn)擊此處免費(fèi)領(lǐng)取,暗號(hào)csdn已經(jīng)有了的程序員,請(qǐng)忽略。
總結(jié)
以上是生活随笔為你收集整理的《码出高效-阿里巴巴Java开发手册-泰山版》阿里最新出品的泰山版Java开发手册,告别垃圾代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。