2019.06.19 《阿里巴巴Java开发手册》时隔一年,发布更新1.5.0华山版。同时,将更名为《Java开发手册》,涵盖史无前例的三大升级

  • 1)鉴于本手册是社区开发者集体智慧的结晶,本版本移除阿里巴巴 Java 开发手册的限定词“阿里巴巴”。
  • 2)新增 21 条新规约。比如,switch 的 NPE 问题、浮点数的比较、无泛型限制、锁的使用方式、判断表达式、日期格式等。
  • 3)修改描述 112 处。比如,IFNULL 的判断、集合的 toArray、日志处理等。
  • 4)完善若干处示例。比如,命名示例、卫语句示例、enum 示例、finally 的 return示例等。

新版手册有哪些值得关注的亮点?

首先是关于新增的21条故障相关的规范,全部源于业界经典事实故障,经过广大开发者深度讨论提炼而成。表面看似简单,实质是直击代码灵魂的考究,唯有内功深厚之人方能看透底层。随手列举其中三条,一起来感受下:

1.Lock 锁的使用往往稍微不注意,可能导致死锁的问题。

在使用阻塞等待获取锁的方式中,必须在 try 代码块之外,并且在加锁方法与 try 代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在 finally 中无法解锁。

如果在 lock 方法与 try 代码块之间的方法调用抛出异常,那么无法解锁,造成其它线程无法成功获取锁。如果 lock 方法在 try 代码块之内,可能由于其它方法抛出异常,导致在 finally代码块中,unlock 对未加锁的对象解锁,它会调用 AQS 的 tryRelease 方法(取决于具体实现类),抛出 IllegalMonitorStateException 异常。在 Lock 对象的 lock方法实现中可能抛出 unchecked 异常。而在使用尝试机制来获取锁的方式中,比如 tryLock(),在进入业务代码块之前,必须先判断当前线程是否持有锁。

锁的释放规则与锁的阻塞等待方式相同。Lock 对象的 unlock 方法在执行时,它会调用 AQS 的 tryRelease 方法(取决于具体实现类),如果当前线程不持有锁,则抛出 IllegalMonitorStateException 异常。

2.switch 的 NPE 问题。

当 switch 括号内的变量类型为 String 并且此变量为外部参数时,必须先进行 null 判断。如下的代码输出是什么?

     publicclass SwitchString {
publicstaticvoidmain(String[] args){
method(null);
} publicstaticvoidmethod(String param){
switch(param){
// 肯定不是进入这里
case"sth":
System.out.println("it's sth");
break;
// 也不是进入这里
case"null":
System.out.println("it's null");
break;
// 也不是进入这里
default:
System.out.println("default");
}
}
}

3.浮点数的比较问题。

1-0.9=0.1是天经地义的,但在计算机的世界里,0.1恰恰是无法精确表示的一个小数,只有2的幂次倍小数才能够精确表示,如:0.5、0.25、0.125等。由于0.1是近似表达,在各种情形中的计算存在数位的取舍精度不一样,所以1-0.9未必等于0.9-0.8,所以浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。

说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数,具体原理参考《码出高效》。示例如下:

    float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f; if (a == b) {
// 预期进入此代码块,执行其它业务逻辑
// 但是 a==b 的结果为false
} Float x = Float.valueOf(a);
Float y = Float.valueOf(b);
if (x.equals(y)) {
// 预期进入此代码块,执行其它业务逻辑
// 但是 x.equals(y) 的结果为false
}

《Java开发手册》自始至终不是最完美的,但是有了业界所有开发者的关注与支持,我们相信它在一步步走向完美。在广大开发者的建议下,此次“华山版”修正了过往历史版本的两个错误。

1.集合转数组时的传入数组的空间设置。有读者追踪这个问题长达半年之久,大家可以到P3C的ISSUE里找到关于这段论战的历史轨迹。他指出,toArray 的数组长度必须设置为0。后来我们发现在高并发情况下,他的说法是对的。

2.关于 ScheduleService 的删除。关于这个方法创建线程池,虽然可以模仿出来它的 OOM 情况,但是找遍 JDK 没有任何替代的方式。所以我们回到它的原点问题上,深入地思考会不会有人使用 ScheduleService 的方式,不断地加入队列中呢?它是一个定时执行的线程池,这种操作方式是不是过于暴力、为赋新词强说愁?权衡之下,最后新版手册去掉这条规约的检测。

为了让更多基础入门的开发者能更快、准确理解规约背后的思路,此次新版也对部分略显艰涩的示例做了更生动的解释。以贴合实际生活场景的视角,帮助读者理解代码世界中的逻辑原理。

比如,关于卫语句的说明,原来的例子理解起来是有难度的,修正为从女孩子相亲的视角来看待。在嵌套语句的要求中,如果非得使用 if()…else if()…else…方式表达逻辑,请勿超过3层,超过请使用状态设计模式。超过3层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现,其中卫语句示例如下:

public class GuardSatementsDemo{
public void findBoyfriend(Man man) {
if(man.isBadTemper()) {
System.out.println(“月球有多远,你就给我滚多远.”);
return;
} if (man.isShort()) {
System.out.println(“我不需要武大郎一样的男友.”);
return;
} if (man.isPoor()) {
System.out.println(“贫贱夫妻百事哀.”);
return;
} System.out.println(“可以先交往一段时间看看.”);
}
}

看了这么多新特性,那必须得花上喝咖啡的时间,学习一下,为自己写的程序保驾护航。

最新版的领取方式:微信关注"Java技术干货",回复"book001",即可下载。赶快学起来咯~~~

《阿里巴巴Java开发手册》改名《Java开发手册》,涵盖史无前例的三大升级的更多相关文章

  1. 阿里巴巴天猫超市团队招聘java开发工程师

    大家好,发个招聘信息:我是阿里巴巴集天猫超市开发团队的同学,我们部门目前在杭州招人,P6岗位,要求至少本科,熟悉java,spring等java开发技术,最好有互联网企业开发经验,感兴趣的可以通过我直 ...

  2. Java基础教程(2)--Java开发环境

    一.JVM.JRE和JDK的概念   对于初学者来说,这三个术语出现的频率很高,而且有关这它们的问题在面试题中也会经常出现.因此,理解它们的定义.区别和联系就显得尤为重要.在学习这几个专业术语之前,我 ...

  3. 我的Java之旅 第一课 开发环境准备

    1.JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK). SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从J ...

  4. SLG手游Java服务器的设计与开发——数据管理

    文章版权归腾讯GAD所有,禁止匿名转载:禁止商业使用:禁止个人使用. 一.前言 上文介绍了我们的SLG手游的服务器架构设计以及网络通信部分,本文介绍数据管理部分,在数据存储方面,我选择了Mysql.M ...

  5. Java必备的几个开发工具,你会几个?

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 常用工具干货,会从以下几个方面汇总,本文会长期更新. 开发工具篇 M ...

  6. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  7. 使用eclipse开发Morphline的Java代码段

    背景:morphline是一个轻量级的etl工具.除了提供标准化的方法之外,还可以定制化的开发java片段.定制化的java片段会在加载时被作为一个独立的类编译,对源数据作处理. morphline关 ...

  8. 手机APP开发:学JAVA转安卓APP开发是不是很容易?

    成都亿合云商小编为您分享:Android开发是以Java语言为基础的,Android 虽然使用Java 语言作为开发工具,但是在实际开发中发现,还是与Java SDK 有一些不同的地方.Android ...

  9. [Java Web] 2、Web开发中的一些架构

    1.企业开发架构: 企业平台开发大量采用B/S开发模式,不管采用何种动态Web实现手段,其操作形式都是一样的,其核心操作的大部分都是围绕着数据库进行的.但是如果使用编程语言进行数据库开发,要涉及很多诸 ...

随机推荐

  1. idea 搭建 SpringBoot 集成 mybatis

    编译器:IDEA2018.2.3 环境:win10,jdk1.8,maven3.4 数据库:mysql 5.7 备注:截图较大,如果看不清,可以在图片上右键=>在新标签页中打开   查看高清大图 ...

  2. Android无线调试——抛开USB数据线

    开发Android的朋友都知道,真机调试需要把手机与PC相连,然后把应用部署到真机上进行安装和调试.长长的USB线显得很麻烦,而且如果需要USB接口与其他设备连接的话显得很不方便.今天介绍一种不通过U ...

  3. Extensible File System

    An extensible file system format for portable storage media is provided. The extensible file system ...

  4. 它们的定义Activity跳转动画

    本来觉得是一个非常小的需求, 后来我发现总是 错误, 采用Theme于 4.0在 操作不是很容易使用. 后来查阅资料, 须要在finish 后面 和 startActivity 后面加入 overri ...

  5. HDU 1671 (字典树统计是否有前缀)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671 Problem Description Given a list of phone number ...

  6. 简明Python3教程 13.面向对象编程

    简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的 ...

  7. 乞讨 间隔[a,b]在见面p^k*q*^m(k>m)中数号码

    标题叙述性说明: 1<=a,b<=10^18,p,q他们是素数  2<=p,q<=10^9; 求在[a,b]内能够表示为  x*p^k*q^m  k > m   的数的个 ...

  8. 用C++写UI库最本质的思想就是不用C++写UI(如何用 C++ 从零编写 GUI?内含多个开源UI作者的回复,非常精彩)

    作者:Bingo链接:https://www.zhihu.com/question/24462113/answer/83371803来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  9. 从入门机器学习的零单排:OctaveMatlab经常使用绘图知识

    OctaveMatlab经常使用绘图知识 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错,算是入门了.这次打算以该课程的作业为主线,对机器学习基本知识做一下总结.小弟 ...

  10. opencart源码解析之 index.php

    //访问index.php,安全过滤.加载配置文件.核心启动文件.函数库.类库 //转载请注明: http://blog.csdn.net/dabao1989/article/details/2122 ...