解析一下阿里出品的泰山版 Java 开发手册
说起华山,我就想起岳不群,不,令狐冲;说起泰山,我就想起司马迁,他的那句名言“人总有一死,或重于泰山,或轻于鸿毛”,真的发人深省啊。这就意味着,阿里出品的泰山版 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,奥利给!
解析一下阿里出品的泰山版 Java 开发手册的更多相关文章
- 2020阿里最新出品的泰山版Java开发手册,告别垃圾代码
说起华山,我就想起岳不群,不,令狐冲:说起泰山,我就想起司马迁,他的那句名言"人总有一死,或重于泰山,或轻于鸿毛",真的发人深省啊.这就意味着,阿里出品的泰山版 Java 开发手册 ...
- 阿里出品的最新版 Java 开发手册,嵩山版,扫地僧
说起嵩山,我就想起乔峰,想起慕容复,以及他们两位老爹在少林寺大战的场景.当然了,最令我印象深刻的就是那位默默无闻,却一鸣惊人的扫地僧啊.这次,阿里出品的嵩山版 Java 开发手册的封面就有一个扫地僧, ...
- 重磅!阿里发布《Java开发手册(泰山版)》
最近,阿里的<Java开发手册>又更新了,这个版本历经一年的修炼,取名:<Java开发手册(泰山版)>正式出道. 正所谓无规矩不成方圆,在程序员的世界里,也存在很多规范,阿里出 ...
- 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》
终极版 v1.3.0 2017年开春之际,阿里诚意献上重磅大礼:<阿里巴巴Java开发手册>,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平, ...
- 阿里巴巴java开发手册-泰山版 下载
最近,阿里的<Java开发手册>又更新了,这个版本历经一年的修炼,取名:<Java开发手册(泰山版)>正式出道.正所谓无规矩不成方圆,在程序员的世界里,也存在很多规范,阿里出版 ...
- 阿里正式发布《Java开发手册》终极版!
摘要: 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质 ...
- 阿里巴巴主导的“华山版《Java 开发手册》”简介
1."83行代码计划"项目介绍(转自github): 2018年9月22日,在2018杭州云栖大会上,召开<码出高效:Java 开发手册>新书发布会,并宣布将图书所有收 ...
- 唯品会Java开发手册》1.0.2版阅读
<唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...
- 阅读阿里Java开发手册记录
概述 在阅读完阿里Java开发手册(嵩山版)后,发现自己在开发过程中有一些没有按照规范开发的情况,这里将容易忘记的规范记录下来,并且添加自己的理解,一方面方便自己巩固记忆,另一方面希望对其他同学能够提 ...
随机推荐
- 【cs224w】Lecture 5 - 谱聚类
Spectral Clustering 前面的课程说到了 community detection 并介绍了两种算法.这次来说说另外一类做社区聚类的算法,谱聚类.这种算法一般分为三个步骤 pre-pro ...
- 四、【Docker笔记】Docker容器
容器是Docker的另一个核心概念,容器就是镜像的一个运行实例,只是它具有一个可写的文件层,而镜像是一个只读的文件. 一.创建容器 1.新建容器 我们可以使用 docker create 命令来创建一 ...
- NKOJ4330 逛公园
时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 3s 问题描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入 ...
- Face The Right Way POJ - 3276(区间)
Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing forward, li ...
- python CGI 编程实践
文章更新于:2020-03-05 注1:安装 python 参见: python 的安装使用和基本语法 注2:配置 web 环境参见: Windows&linux使用集成环境搭建 web 服务 ...
- spring的jdbc具名参数
在jdbc的模板中使用具名参数: 1.就需要在之前的jdbc的例子中进行修改:需要在xml文件中重新配置一个bean.这是固定的格式.如下 对于使用具名参数而言.配置NamedParameterJdb ...
- wireshark抓包实战(二),第一次抓包
1.选择网卡. 因为wireshark是基于网卡进行抓包的,所以这时候我们必须选取一个网卡进行抓包.选择网卡一般有三种方式 (1)第一种 当我们刚打开软件是会自动提醒您选择,例如: (2)第二种 这时 ...
- 初探CI,Github调戏Action手记——自动构建并发布
前言 最近在做脚本的说明文档时使用了vuepress这个东西 前端实在是菜,只能随便写写了 正常写完md文件之后推送至github做版本控制 而前端页面的生成则是在本地,部署也是在本地手工进行 一套下 ...
- Mac OS安装docker
MacOS Docker 安装 使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac ...
- Java基础】并发 - 多线程
Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数 ...