前几天,也就是 4 月 22 日,阿里发布了「Java开发手册泰山版」,我也是在看到的第一时间就下载下来学习。
这次发布阿里也是十分重视,我是在阿里云的首页的广告上看到的,这次给了足够的曝光度。
相比较第一版,我都不知道是从哪流传出来的,当年还是一个朋友神秘兮兮的跟我说,「给你个好东西,看完保准你不后悔」.
听这说话的语气,我还以为他在跟我搞颜色。
从去年的「华山版」开始,阿里的「Java 开发手册」开始以五岳命名,不过这种命名看起来总有一种怪怪的感觉。
看到华山我第一个想到的是华山论剑和那个练葵花宝典的兄弟。
华山版更新于 2019 年 6 月 13 日,距今差不多 10 个月的时间,也是时候更新一个版本了,这次命名的泰山版听起来就有一种大气、稳重的感觉。
历史的一些版本我全都打包放到云盘了,有需要的同学可以在公众号中回复关键字「Java开发手册」获取。
除了这些还有就是本次发布的泰山版。
先看下本次更新的内容:
- 发布错误码统一解决方案。
- 新增 34 条新规约。比如,日期时间的闰年、闰月问题,三目运算的自动拆箱, SQL
查询的表别名限定, Collectors 类的 toMap()方法使用注意等。 - 修改描述 90 处。 比如, 阻塞等待锁、 建表的小数类型等。
- 完善若干处示例。比如, ISNULL 的示例等
错误码统一解决方案
本次也是第一次发布错误码的统一解决方案,那么错误码是用在哪里的?
答案是异常日志里,方便我们快速的知晓错误来源以及判断到底是谁那里出的问题。
错误码共分为 5 位,分成两个部分:错误产生来源+四位数字编号,具体释义如下:
- A 代表的是错误来源于用户端,也就是客户端,用户操作时产生的错误。
- B 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题。
- C 表示错误来源于第三方服务,比如 CDN 服务出错,消息投递超时等问题。
四位数字编号从 0001 到 9999,大类之间的步长间距预留 100 。
这种解决方案还是十分值得借鉴的,在成熟的系统中,错误码统一的解决方案是十分必要的。
我们可以通过标准的错误码,直观的知道当前异常是在哪里产生的,根据错误码的字典,可以详细的知道具体的错误原因。
34 条新增的规约
34 条新增的规约太多了,我就简单挑一些我认为比较重要的说一下。
1. 年份天数禁止写死 365 天
这个我觉得是十分必要的,很多时候,在写代码的时候少想一步,就会为未来埋雷,而且这种雷在测试的时候,不一定是可以发现的。
比如我们在设置缓存的时候,约定缓存存储时间为一年,代码中却写死了 365 天,在闰年的最后一天,时间归零后,所有的请求将会落在数据库上,直接对数据库产生毁灭性的打击。
在规约中,建议我们获取年份的天数使用以下代码:
// 获取今年的天数
int daysOfThisYear = LocalDate.now().lengthOfYear();
// 获取指定某年的天数
LocalDate.of(2011, 1, 1).lengthOfYear();
2. 三目运算 NPE
关于三目运算符产生 NPE 的这个问题,我之前还真的没有注意过,也是借着这次的机会来学习一下,先来看下下面这段代码:
class DemoTests {
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
类型自动拆箱,由于当前的 c 的值是 null ,就会抛出下面这个异常:
Exception in thread "main" java.lang.NullPointerException
at com.geekdigging.demo.DemoTests.main(DemoTests.java:14)
这是因为在计算问号后面两个表达式的时候,是需要对齐的,当其中一个表达式进行算数运算,会调用 intValue()
这个方法进行自动拆箱成基础运算符,而在三目运算符中,两个表达式的类型必须一致,这就导致了 c 也调用了 intValue()
,但是 c 本身为 null ,这就直接导致了 NPE 的异常。
日期时间
我们常用的日期时间的格式化, YYYY 和 yyyy ,这其中的区别不知道有多少人能分得清楚。
yyyy 表示的是当前天所在的年,而 YYYY 表示的是当前周所在的年,乍一看上去好像没什么问题,但是如果当前周跨年,那么使用 YYYY 取到的年份可能并不是我们想要的结果。
顺便还有以下内容值得注意:
- 表示月份是大写的 M
- 表示分钟则是小写的 m
- 24 小时制的是大写的 H
- 12 小时制的则是小写的 h
推荐的时间日期格式化如下:
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
修改描述 90 处和完善若干处示例
这两条我没有和前一版华山版做详细的比对,有兴趣的同学可以自行比对下。
最后
从 2016 年 12 月份的第一版「Java开发手册」发布,再到今天的「泰山版」的发布,已经走过了三年多的时间,这份手册,也在社区和业界的 Java 开发者的共同努力下,成为了普遍遵循的规范。
这份手册包含的知识点非常全面,七大维度编程规约、异常日志、单元测试、安全规约、 MySQL 数据库、工程规约、设计规约都有罗列。
如果你想成为一名优秀的工程师,不仅仅只是 Java 工程师,那么这份手册绝对值得你花时间仔细研读一番,这份手册涵盖了七大维度,除了部分内容是和 Java 的语法紧密贴合,其中还有很多部分是在讲述一些普世的开发规约,无论你的主攻方向是什么语言,这份手册都有一定的借鉴意义。
最后再插一句,历史全部版本在公众号后台回复关键字「Java开发手册」,即可获取。
就酱。