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",即可下载。赶快学起来咯~~~

最新文章

  1. 大数据项目实践:基于hadoop+spark+mongodb+mysql+c#开发医院临床知识库系统
  2. Visual Studio图片注释image-comments扩展
  3. Effective Java 47 Know and use the libraries
  4. oracle用sqlplus创建新用户,不是plsql developer
  5. vim开发环境配置
  6. 一分钟制作U盘版BT3 - 有图滴儿 bt3破解教程
  7. SAP标准教材列表
  8. 详解null
  9. epoll_create, epoll_ctl和epoll_wait
  10. 数据结构《21》----2014 WAP 第一个问题----Immutable queue
  11. codewars-random(4)
  12. 下载安装Cygwin
  13. Java API 常用类(一)
  14. Linux三剑客之awk最佳实践
  15. 每日冲刺报告——Day2(Java-Team)
  16. 【java】-- 线程池原理分析
  17. Springboot中的事件Event
  18. IT部门不应该是一个后勤部门
  19. react一看就会的简单路由设置
  20. 04-体验一下apache组织封装的BeanUtil工具包

热门文章

  1. win7 UAC bypass(微软已经给予了三组组件绕过UAC启动的特权)
  2. XamlReader 动态加载XAML
  3. C++于public、protected和private说明(From MSDN)
  4. Get and Post(Unity3D六个发展)
  5. [转]更改ejs模板后缀.ejs为.html
  6. WPF HeaderedContentControl两个内容属性 Header和Content
  7. 绕过010Editor网络验证(用python做一个仿真http server真容易,就几行代码)
  8. VC中出现“烫”和“屯”的原因(栈区的每一个字节都被0xCC填充了,也就是int 3h的机器码,动态分配的堆,VC的Debug用0xCD填充堆的空间,就出现了“屯”)
  9. EPPlus导出两千万行记录到xlsx的c#代码
  10. SQL Server 数据库所有表增加同一列