部分来源:https:juejin。impost5ea632656fb9a03c4237b95e 说起华山,我就想起岳不群,不,令狐冲;说起泰山,我就想起司马迁,他的那句名言人总有一死,或重于泰山,或轻于鸿毛,真的发人深省啊。这就意味着,阿里出品的泰山版Java开发手册,是迄今为止最重量级的。 华山版是上个版本,啥时候更新的呢?2019年06月13号,距离现在10个月了,时间也不短了,是时候更新了。 新版都更新了哪些内容呢?可以从官方的版本历史中看得出来。01、发布错误码统一解决方案 错误码用来干嘛呢?答案是异常日志,方便我们快速知晓错误来源,判断是谁那出的问题。上图中A表示错误来源于用户;还有B级的,表示错误来源于当前系统;C级的,表示错误来源于第三方服务,比如CDN服务器。 这个解决方案还是值得借鉴的,很多成熟的系统都在使用错误码,如果你对接过微信支付的话,应该对错误码不会感到陌生。看到错误码,然后在手册中搜索一下,就能快速知晓错误的类型,还是很不错的。02、新增34条新的规约 34条太多了,我就挑几个重要的拉出来说一说吧。 1)日期时间 还记得上次技术圈的刷屏事件吧?就是那个YYYY和yyyy造成的问题。大写的Y表示的是当天所在的这一周是属于哪个年份的,小写的y表示的是当天所在的年份,差别还是挺大的。你品,你细品。 还有,大写的M和小写的m是不同的,大写的H和小写的h也是不同的。 另外,像获取当前毫秒数应该使用System。currentTimeMillis(),而不是newDate()。getTime(),这些细致的规约,都应该牢记在心中,不要去犯这些低级的错误。 2)三目运算的NPE问题 说实话,这个问题我之前从来没有注意,这次看到了,就一起来学习一下。先来看下面这段代码:publicclassTestCondition{publicstaticvoidmain(String〔〕args){Integera1;Integerb2;IBIntegerresultflag?ab:c;}} 条件ab属于算术运算,它俩相乘后的结果是一个int类型,这就会导致c这个Integer类型自动拆箱,由于值为null,就抛出了以下错误:Exceptioninthreadmainjava。lang。NullPointerExceptionatcom。cmower。mkyong。TestCondition。main(TestCondition。java:9) 那可能你会感到好奇,为什么两个Integer类型的变量相乘后会是一个int类型呢,这主要是由编译器决定的,它就是这么设计的,来看一下反编译后的字节码:publicclassTestCondition{publicstaticvoidmain(Stringargs〔〕){IntegeraInteger。valueOf(1);IntegerbInteger。valueOf(2);IBooleanflagBoolean。valueOf(false);IntegerresultInteger。valueOf(flag。booleanValue()?a。intValue()b。intValue():c。intValue());}} ab时发生了自动拆箱,调用了intValue()方法,而三元运算的两个表达式的类型必须一致,这就导致c也调用了intValue()方法,由于c本身为null,那就只能NPE了。明白了吧? 3)Collectors类的toMap()方法 手册上说,在使用java。util。stream。Collectors类的toMap()方法转Map时,一定要使用含有参数类型为BinaryOperator,参数名为mergeFunction的方法,否则当出现相同key值时会抛出IllegalStateException异常。 这段话可能理解上有点难度,那先来看一段代码吧!String〔〕departmentsnewString〔〕{沉默王二,沉默王二,沉默王三};MapInteger,StringmapArrays。stream(departments)。collect(Collectors。toMap(String::hashCode,strstr)); 运行这段代码的时候,就会抛出异常,堆栈信息如下所示:Exceptioninthreadmainjava。lang。IllegalStateException:Duplicatekey867758096(attemptedmergingvalues沉默王二and沉默王二)atjava。basejava。util。stream。Collectors。duplicateKeyException(Collectors。java:133)atjava。basejava。util。stream。Collectors。lambdauniqKeysMapAccumulator1(Collectors。java:180) key重复了,因为两个沉默王二的hashCode相同,那这时候的解决办法呢?String〔〕departmentsnewString〔〕{沉默王二,沉默王二,沉默王三};MapInteger,StringmapArrays。stream(departments)。collect(Collectors。toMap(String::hashCode,strstr,(v1,v2)v2)); 多加个参数(v1,v2)v2,也就是重复的时候选一个。来看看此时调用的toMap()方法吧。publicstaticT,K,UCollectorT,?,MapK,UtoMap(F?superT,?extendsKkeyMapper,F?superT,?extendsUvalueMapper,BinaryOperatorUmergeFunction){returntoMap(keyMapper,valueMapper,mergeFunction,HashMap::new);} BinaryOperator和mergeFunction是不是出现了?03、修改描述90处 手册上说,比如,阻塞等待锁、建表的小数类型等描述有修改,我特么花了半个小时也没有找出来和上一个版本之间的差别。 不知道是不是手册的小编在瞎说,你要是能发现差别,告诉我一声。04、完善若干处示例 比如说SQL语句栏目里的ISNULL的示例,确实比华山版追加了一个更详细的反例,见下图。 但说实话,这段反例的描述我看了至少六遍才搞懂是什么意思。首先,不要在null前换行,影响阅读性,这倒是真的;其次呢,不要使用columnisnull进行判空,使用ISNULL(column)判空,效率更高,也不会出现换行的情况。selectfromcmssubjectwherecolumnisnullandcolumn1selectfromcmssubjectwhereISNULL(column)andcolumn1复制代码05、最后 2016年12月份,阿里首次向业界开放了这份《Java开发手册》,到泰山版发布,已经过去了3年多时间了,这份手册也在全球Java开发者共同的努力下,成为业界普遍遵循的开发规范。这份手册包含的知识点非常全面,七大维度编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约都有罗列。阿里巴巴内部开发手册1。4。0版终极版 内部开发手册 阿里巴巴内部PPT、PDF及JD亿级流量架构 阿里内部PPT、PDF及开发手册1。4。0版终极版泰山版感兴趣的关注我私信回复【文档】即可免费领取