性能文章>它来了:阿里巴巴Java开发手册泰山版解读>

它来了:阿里巴巴Java开发手册泰山版解读原创

2年前
8002416

《Java开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,公开到业界后,众多社区开发者踊跃参与,共同打磨完善,系统化地整理成册。

image.png

会当凌绝顶,一览众山小。经过一年的修炼,《Java开发手册》泰山版于4.22正式发布。此次泰山版发布,将带来三大亮点:「新增5条日期时间规约」;「新增2条表别名sql规约」;「新增统一错误码规约」

image.png

接下来,让笔者阿飞带你一起解读最新泰山版本新增的3项规约。

日期时间规约

如下图所示,新增的日期时间规约归属于第一部分:「编程规约」

image.png

这一段总计此次新增了7个规约条例,前五条全部是 「强制」 类型的:

  1. 日期格式化时,传入pattern中表示年份统一使用小写的y。「解读」:yyyy表示当天所在的年,而大写的YYYY代表是 week in which year。意思是当天所在的周所属的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。

  2. 在日期格式中分清楚大写的 M 和小写的 m,大写的 H 和小写的 h 分别指代的意义。「解读」:大写M表示月份,小写m表示分钟。大写H表示24小时制,小写h表示12小时制。

  3. 获取当前毫秒数:System.currentTimeMillis(); 而不是 new Date().getTime()。 「解读」:System.currentTimeMillis()是一个native方法,依赖操作系统,性能更好。而后者事实上是调用了前者获取时间然后封装一个Date对象!

  4. 不允许在程序任何地方中使用:1)java.sql.Date 2)java.sql.Time 3)java.sql.Timestamp。「解读」:第1个不记录时间,getHours()抛出异常;第2个不记录日期,getYear()抛出异常;第3个在构造方法 super((time/1000)*1000),fastTime和nanos分开存储秒和纳秒信息。

  5. 不要在程序中写死一年为 365 天,避免在公历闰年时出现日期转换错误或程序逻辑错误。

  6. 后两条是 「推荐」 类型的:

  7. 避免公历闰年2月问题。闰年的2月份有29天,一年后的那一天不可能是2月 29日。「解读」:打个比方,某个任务想一年运行一次,那么cron表达式不要写成:0 0 0 29 2 ?。而应该写成:0 0 0 28 2 ?。前一个表达式实际上是4年才执行一次,后一个表达式才是一年执行一次。

  8. 使用枚举值来指代月份。如果使用数字,注意 Date,Calendar 等日期相关类的月份 month 取值在 0-11 之间。「解读」:Calendar.JANUARY的值实际上就是0(Calendar中定义为:public final static int JANUARY = 0)。

2条表别名sql规约

此次泰山版新增了两条表别名sql规约。一条是强制的,一条是推荐的。

「强制」 对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定。说明:对多表进行查询记录、更新记录、删除记录时,如果对操作列没有限定表的别名(或表名),并且操作列在多个表中存在时,就会抛异常,相信大家都碰到过Column ‘xxxx’ in field list is ambiguous这个异常提示吧。正例:select t1.name from table_first as t1 , table_second as t2 where t1.id=t2.id;

「建议」 SQL语句中表的别名前加as,并且以 t1、t2、t3、…的顺序依次命名。说明:1)别名可以是表的简称,或者是根据表出现的顺序,以 t1、t2、t3 的方式命名。2)别名前加as使别名更容易识别。参考正例:select t1.name from table_first as t1, table_second as t2 where t1.id=t2.id

统一错误码规约

如下图所示,新增的统一错误码规约是一个全新的部分,即附3。错误码定义对每一个系统的重要性不言而喻,可以说必不可少。良好的错误码定义能让API的结果变得更易懂,同时能大大提升排查问题效率,并且还可以针对每个异常码出现的次数做实时监控:

image.png

如下图所示,是截取的部分错误码。

image.png

分类:
标签:
请先登录,再评论

这是要把山都来一遍的节奏啊

2年前

先赞为敬

2年前

泰山版和华山版有啥区别?

2年前
回复 长风liux_437053:

泰山版是2020年四月份最新版,华山版是去年下半年版本

2年前回复

飞哥给力

2年前

为你推荐

字符串字面量长度是有限制的
前言 偶然在一次单元测试中写了一个非常长的字符串字面量。 正文 在一次单元测试中,我写了一个很长的字符串字面量,大概10万个字符左右,编译时,编译器给出了异常告警 `java: constant
多次字符串相加一定要用StringBuilder而不用-吗?
今天在写一个读取Java class File并进行分析的Demo时,偶然发现了下面这个场景(基于oracle jdk 1.8.0_144): ``` package test; public c
如何通过反射获得方法的真实参数名(以及扩展研究)
前段时间,在做一个小的工程时,遇到了需要通过反射获得方法真实参数名的场景,在这里我遇到了一些小小的问题,后来在部门老大的指导下,我解决了这个问题。通过解决这个问题,附带着我了解到了很多新的知识,我觉得
高吞吐、低延迟 Java 应用的 GC 优化实践
本篇原文作者是 LinkedIn 的 Swapnil Ghike,这篇文章讲述了 LinkedIn 的 Feed 产品的 GC 优化过程,虽然文章写作于 April 8, 2014,但其中的很多内容和
「每日五分钟,玩转 JVM」:久识你名,初居我心
聊聊 JVMJVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别。JVM可以说和我们是老朋友了
据说99.99%的人都会答错的类加载的问题
概述首先还是把问题抛给大家,这个问题也是我厂同学在做一个性能分析产品的时候碰到的一个问题。 同一个类加载器对象是否可以加载同一个类文件多次并且得到多个Class对象而都可以被java层使用吗请仔细注意
Java多线程——并发测试
编写并发程序时候,可以采取和串行程序相同的编程方式。唯一的难点在于,并发程序存在不确定性,这种不确定性会令程序出错的地方远比串行程序多,出现的方式也没有固定规则。那么如何在测试中,尽可能的暴露出这些问
Java多线程知识小抄集(一)
本文主要整理笔者遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆。 1.interr