1. 首页
  2. 杂谈

阿里重磅发布「Java开发手册泰山版」

点击数:1

阿里重磅发布「Java开发手册泰山版」

前几天,也就是 4 月 22 日,阿里发布了「Java开发手册泰山版」,我也是在看到的第一时间就下载下来学习。

这次发布阿里也是十分重视,我是在阿里云的首页的广告上看到的,这次给了足够的曝光度。

相比较第一版,我都不知道是从哪流传出来的,当年还是一个朋友神秘兮兮的跟我说,「给你个好东西,看完保准你不后悔」.

听这说话的语气,我还以为他在跟我搞颜色。

阿里重磅发布「Java开发手册泰山版」

从去年的「华山版」开始,阿里的「Java 开发手册」开始以五岳命名,不过这种命名看起来总有一种怪怪的感觉。

看到华山我第一个想到的是华山论剑和那个练葵花宝典的兄弟。

阿里重磅发布「Java开发手册泰山版」

华山版更新于 2019 年 6 月 13 日,距今差不多 10 个月的时间,也是时候更新一个版本了,这次命名的泰山版听起来就有一种大气、稳重的感觉。

历史的一些版本我全都打包放到云盘了,有需要的同学可以在公众号中回复关键字「Java开发手册」获取。

阿里重磅发布「Java开发手册泰山版」

除了这些还有就是本次发布的泰山版。

先看下本次更新的内容:

  • 发布错误码统一解决方案。
  • 新增 34 条新规约。比如,日期时间的闰年、闰月问题,三目运算的自动拆箱, SQL
    查询的表别名限定, Collectors 类的 toMap()方法使用注意等。
  • 修改描述 90 处。 比如, 阻塞等待锁、 建表的小数类型等。
  • 完善若干处示例。比如, ISNULL 的示例等

错误码统一解决方案

阿里重磅发布「Java开发手册泰山版」

本次也是第一次发布错误码的统一解决方案,那么错误码是用在哪里的?

答案是异常日志里,方便我们快速的知晓错误来源以及判断到底是谁那里出的问题。

错误码共分为 5 位,分成两个部分:错误产生来源+四位数字编号,具体释义如下:

  • A 代表的是错误来源于用户端,也就是客户端,用户操作时产生的错误。
  • B 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题。
  • C 表示错误来源于第三方服务,比如 CDN 服务出错,消息投递超时等问题。

四位数字编号从 0001 到 9999,大类之间的步长间距预留 100 。

这种解决方案还是十分值得借鉴的,在成熟的系统中,错误码统一的解决方案是十分必要的。

我们可以通过标准的错误码,直观的知道当前异常是在哪里产生的,根据错误码的字典,可以详细的知道具体的错误原因。

34 条新增的规约

34 条新增的规约太多了,我就简单挑一些我认为比较重要的说一下。

1. 年份天数禁止写死 365 天

这个我觉得是十分必要的,很多时候,在写代码的时候少想一步,就会为未来埋雷,而且这种雷在测试的时候,不一定是可以发现的。

比如我们在设置缓存的时候,约定缓存存储时间为一年,代码中却写死了 365 天,在闰年的最后一天,时间归零后,所有的请求将会落在数据库上,直接对数据库产生毁灭性的打击。

阿里重磅发布「Java开发手册泰山版」

在规约中,建议我们获取年份的天数使用以下代码:

// 获取今年的天数
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开发手册」,即可获取。

就酱。

转载声明:本博客由极客挖掘机创作,采用 CC BY 3.0 CN 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

QR code