说起华山,我就想起岳不群,不,令狐冲;说起泰山,我就想起司马迁,他的那句名言“人总有一死,或重于泰山,或轻于鸿毛”,真的发人深省啊。这就意味着,阿里出品的泰山版 Java 开发手册,是迄今为止最重量级的。

华山版是上个版本,啥时候更新的呢?2019 年 06 月 13 号,距离现在 10 个月了,时间也不短了,是时候更新了。

新版都更新了哪些内容呢?可以从官方的版本历史中看得出来。

01、发布错误码统一解决方案



错误码用来干嘛呢?答案是异常日志,方便我们快速知晓错误来源,判断是谁那出的问题。上图中 A 表示错误来源于用户;还有 B 级的,表示错误来源于当前系统;C 级的,表示错误来源于第三方服务,比如 CDN 服务器。

这个解决方案还是值得借鉴的,很多成熟的系统都在使用错误码,如果你对接过微信支付的话,应该对错误码不会感到陌生。看到错误码,然后在手册中搜索一下,就能快速知晓错误的类型,还是很不错的。

02.新增 34 条新的规约

34 条太多了,我就挑几个重要的拉出来说一说吧。

1)日期时间

还记得上次技术圈的刷屏事件吧?就是那个 YYYY 和 yyyy 造成的问题。大写的 Y 表示的是当天所在的这一周是属于哪个年份的,小写的 y 表示的是当天所在的年份,差别还是挺大的。你品,你细品。

还有,大写的 M 和 小写的 m 是不同的,大写的 H 和小写的 h 也是不同的。



另外,像获取当前毫秒数应该使用 System.currentTimeMillis(),而不是 new Date().getTime(),这些细致的规约,都应该牢记在心中,不要去犯这些低级的错误。

2)三目运算的 NPE 问题

说实话,这个问题我之前从来没有注意,这次看到了,就一起来学习一下。先来看下面这段代码:

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 属于算术运算,它俩相乘后的结果是一个 int 类型,这就会导致 c 这个 Integer 类型自动拆箱,由于值为 null,就抛出了以下错误:

Exception in thread "main" java.lang.NullPointerException
at com.cmower.mkyong.TestCondition.main(TestCondition.java:9)

那可能你会感到好奇,为什么两个 Integer 类型的变量相乘后会是一个 int 类型呢,这主要是由编译器决定的,它就是这么设计的,来看一下反编译后的字节码:

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 时发生了自动拆箱,调用了 intValue() 方法,而三元运算的两个表达式的类型必须一致,这就导致 c 也调用了 intValue() 方法,由于 c 本身为 null,那就只能 NPE 了。明白了吧?

3)Collectors 类的 toMap() 方法

手册上说,在使用 java.util.stream.Collectors 类的 toMap() 方法转 Map 时,一定要使用含有参数类型为 BinaryOperator,参数名为 mergeFunction 的方法,否则当出现相同 key 值时会抛出 IllegalStateException 异常。

这段话可能理解上有点难度,那先来看一段代码吧!

String[] departments = new String[] {"沉默王二", "沉默王二", "沉默王三"};
Map<Integer, String> map = Arrays.stream(departments)
.collect(Collectors.toMap(String::hashCode, str -> str));

运行这段代码的时候,就会抛出异常,堆栈信息如下所示:

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 重复了,因为两个“沉默王二”的 hashCode 相同,那这时候的解决办法呢?

String[] departments = new String[] {"沉默王二", "沉默王二", "沉默王三"};
Map<Integer, String> map = Arrays.stream(departments)
.collect(Collectors.toMap(String::hashCode, str -> str, (v1, v2) -> v2));

多加个参数 (v1, v2) -> v2,也就是重复的时候选一个。来看看此时调用的 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 是不是出现了?

03、修改描述 90 处

手册上说,比如,阻塞等待锁、建表的小数类型等描述有修改,我特么花了半个小时也没有找出来和上一个版本之间的差别。



不知道是不是手册的小编在瞎说,你要是能发现差别,告诉我一声。

04、完善若干处示例

比如说 SQL 语句栏目里的 ISNULL 的示例,确实比华山版追加了一个更详细的反例,见下图。

但说实话,这段反例的描述我看了至少六遍才搞懂是什么意思。首先,不要在 null 前换行,影响阅读性,这倒是真的;其次呢,不要使用 column is null 进行判空,使用 ISNULL(column) 判空,效率更高,也不会出现换行的情况。

select * from cms_subject where column is null and
column1 is not null; select * from cms_subject where ISNULL(column) and
column1 is not null;

05、最后

2016 年 12 月份,阿里首次向业界开放了这份《Java 开发手册》,到泰山版发布,已经过去了 3 年多时间了,这份手册也在全球 Java 开发者共同的努力下,成为业界普遍遵循的开发规范。这份手册包含的知识点非常全面,七大维度编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约都有罗列。

如果你想成为一名优秀的 Java 工程师,那么这份手册上的内容几乎是必须要掌握的。如果你手上还没有这份手册,可以微信搜索「程序零世界」回复「手册」免费获取。已经有了的小伙伴,请忽略。最后,我衷心地祝福你,希望你能学有所成,to be better,奥利给!

2020阿里最新出品的泰山版Java开发手册,告别垃圾代码的更多相关文章

  1. 解析一下阿里出品的泰山版 Java 开发手册

    说起华山,我就想起岳不群,不,令狐冲:说起泰山,我就想起司马迁,他的那句名言"人总有一死,或重于泰山,或轻于鸿毛",真的发人深省啊.这就意味着,阿里出品的泰山版 Java 开发手册 ...

  2. 阿里出品的最新版 Java 开发手册,嵩山版,扫地僧

    说起嵩山,我就想起乔峰,想起慕容复,以及他们两位老爹在少林寺大战的场景.当然了,最令我印象深刻的就是那位默默无闻,却一鸣惊人的扫地僧啊.这次,阿里出品的嵩山版 Java 开发手册的封面就有一个扫地僧, ...

  3. 《码处高效:Java开发手册》之代码风格

    流水淡,碧天长,鸿雁成行.编码风格,简捷清爽,反引无限风光. 在美剧<硅谷>中有这样一个经典镜头,主人公 Richard 与同为开发工程师的女友闹分手,理由是两人对缩进方式有着截然不同的编 ...

  4. 重磅!阿里发布《Java开发手册(泰山版)》

    最近,阿里的<Java开发手册>又更新了,这个版本历经一年的修炼,取名:<Java开发手册(泰山版)>正式出道. 正所谓无规矩不成方圆,在程序员的世界里,也存在很多规范,阿里出 ...

  5. 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》

    终极版 v1.3.0 2017年开春之际,阿里诚意献上重磅大礼:<阿里巴巴Java开发手册>,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平, ...

  6. 阿里巴巴java开发手册-泰山版 下载

    最近,阿里的<Java开发手册>又更新了,这个版本历经一年的修炼,取名:<Java开发手册(泰山版)>正式出道.正所谓无规矩不成方圆,在程序员的世界里,也存在很多规范,阿里出版 ...

  7. 阿里正式发布《Java开发手册》终极版!

    摘要: 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质 ...

  8. 阿里巴巴java开发手册(2020版)

    阿里巴巴java开发手册(2020版) 2020版 链接: pan.baidu.com/s/1Zls_FUBK- 密码: titz 2019版 链接: pan.baidu.com/s/1cvCVQvj ...

  9. 阿里JAVA开发手册零度的思考理解(二)

    转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...

随机推荐

  1. flask之jinjia2模板语言

    flask_jinjia2.py ''' flask中的jinjia2模板语言(和django中模板类似): (1)模板变量{{ }} (2)模板标签{% %} ①for循环遍历 {% for foo ...

  2. OGG应用进程abend报错无法insert虚拟列

    环境11.2.0.4 linux6.9 RAC2节点,ogg版本Version 12.2.0.1.160823 OGGCORE_OGGADP.12.2.0.1.0_PLATFORMS_161019.1 ...

  3. Java多线程相关面试题及答案-整理

    1.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成 ...

  4. 2017-ACM南宁网络赛

    In this problem, we will define a graph called star graph, and the question is to find the minimum d ...

  5. Closures Basic

    Closures Closures are one of the most powerful features of JavaScript. JavaScript allows for the nes ...

  6. eclipse Maven操作出现No compiler is provided in this environment.Perhaps you are running on a JRE rather than a JDK?

    右键 pom.xml -> Run as -> Maven install 后出现类似如下错误: 解决方法: 1)选择项目后,点击 eclipse 导航栏中 [Window]-->[ ...

  7. 官网下载Java连接MySql驱动jar包

    官网地址:http://dev.mysql.com/downloads/connector/ 1.选择下载驱动 2.选择下载 3.可以不登录直接下载 4.下载下来的是zip压缩包,解压之后,文件夹中有 ...

  8. 【持续更新】springboot相关配置

    @Configuration public class MyWebMvcConfig implements WebMvcConfigurer { //注册了新的访问路径 @Override publi ...

  9. vue 下拉列表动画

    点击可以收起,这里注意先给需要收起展开的的容器设置高度,通过样式v-enter和v-leave-to设置结束和开始前的就可以了

  10. Element Form表单实践(下)

    作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...