说起华山,我就想起岳不群,不,令狐冲;说起泰山,我就想起司马迁,他的那句名言“人总有一死,或重于泰山,或轻于鸿毛”,真的发人深省啊。这就意味着,阿里出品的泰山版 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 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 map = Arrays.stream(departments)

.collect(Collectors.toMap(String::hashCode, str -> str, (v1, v2) -> v2));

多加个参数 (v1, v2) -> v2,也就是重复的时候选一个。来看看此时调用的 toMap() 方法吧。

public static

Collector> toMap(Function super T, ? extends K> keyMapper,

Function super T, ? extends U> valueMapper,

BinaryOperator 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,奥利给!

TowerJ编译java_2020阿里最新出品的泰山版Java开发手册,告别垃圾代码相关推荐

  1. 速来,围观阿里出品的泰山版Java开发手册

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

  2. 阿里为什么推崇java_为什么阿里巴巴 Java 开发手册推荐使用 LongAdder,而不是 volatile?...

    阿里<Java开发手册>最新嵩山版在 8.3 日发布,其中有一段内容引起了老王的注意,内容如下: [参考]volatile 解决多线程内存不可见问题.对于一写多读,是可以解决变量同步问题, ...

  3. 太强了!阿里技术团队重磅开放 《Java 开发手册》(附下载地址)!

    <阿里巴巴 Java 开发手册>的愿景是码出高效,码出质量.它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设计智慧,浓缩成为立体的编程规范和最佳实践. 从严格 ...

  4. 太牛逼了!阿里技术团队重磅开放 《Java 开发手册》(附下载地址)!

    <阿里巴巴 Java 开发手册>的愿景是码出高效,码出质量.它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设计智慧,浓缩成为立体的编程规范和最佳实践. 从严格 ...

  5. 算法导论、数据结构、设计模式、代码整洁之道、大话设计模式、程序员修炼之道、编译原理、编程之美、阿里巴巴java开发手册等电子书合集

    关注公众号[static修饰符],回复"java电子书"获取资源 学习更多的java知识,一同进步.

  6. java三目表达式_史上最强《Java 开发手册》泰山版王者归来

    简介:潜力修炼一年之久的<Java 开发手册(泰山版)>今天发布!此次共计新增 34 条规约,修改描述 90 处,其中错误码规则更是第一次提出完整的解决方案,大家参考错误码示例表,欢迎大家 ...

  7. 在线阅读-阿里Java开发手册最强版本【泰山版】

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

  8. 阿里新版java开发手册(2019华山版、2020泰山版)

    pdf文件链接: https://pan.baidu.com/s/15Q_qCyqLTG0wBFyHVM3zog 提取码: in6y 目录 一. 编程规约 (一) 命名风格 (二) 常量定义 (三) ...

  9. 阿里JAVA开发手册(泰山版)

    目录 前言 一.编程规约 (一)命名风格 (二)常量定义 (三)代码格式 (四)OOP 规约 (五)日期时间 (六)集合处理 (七)并发处理 (八)控制语句 (九)注释规约 (十)其它 二.异常日志 ...

最新文章

  1. 火狐浏览器中添加httprequest的方法
  2. Material Design 设计规范总结(2)
  3. 视频直播技术详解(5)延迟优化
  4. [导入]第 3 章 Enterprise Library 的设计
  5. 电视盒子root_电视盒子 免root 去广告换桌面,20分钟还原干净清爽的桌面
  6. LEETCODE- The First Day (C++)
  7. mysql数据库基本操作总结与归纳
  8. perl中替换文本一例
  9. ​inotify+rsync实时数据同步实践讲解17
  10. JavaScript-面试 表单验证
  11. double 最大_LeetCode 1610—可见点的最大数目
  12. WinZip命令行详解
  13. Apache Tomcat 官网下载
  14. Unity3d的ShadeSH9环境光的球谐函数的应用
  15. 合天网安实验室sql注入实验一 WRITE UP
  16. VMware组建虚拟局域网方法
  17. 网络7层协议,4层,5层?理清容易混淆的几个概念
  18. 2015年高考物理复习重点
  19. C语言中extern的作用
  20. Jmeter请求参数MD5加密

热门文章

  1. 如何用python处理excel简单考勤统计_excel怎么通过打卡记录简单统计考勤?
  2. Nginx配置并使用SSI功能
  3. 基于 vue3 element-plus 的暗黑模式
  4. Socket TCP协议解决粘包、半包问题的三种解决方案
  5. 蓝桥杯单片机设计与开发历届客观题答案
  6. 说几个微信实用重磅功能!
  7. 苹果教你如何保持iPhone电池健康、延长电池寿命
  8. 多线程爬取免费代理ip池 (给我爬)
  9. 2022最详细,最新的 Win11/WIN10 安装CUDA11.2和cuDNN(必坑之作)完美教程
  10. Quick-Cocos2d-x初学者游戏教程1