内容简介:代码是二进制世界的交流方式,极致的代码是我们的荣耀。2017年春天,《阿里巴巴Java开发手册》发布,我们希望在涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约等7个维度上为开发工作提供一点帮助。目前已有超过260万位工程师下载及查阅手册,在数以千计的企业应用,手册成为受业界认可的开发规范。我们也有幸为全行业的研发效能、人才培养、系统稳定性作出力所能及的一点贡献。
致全球 Java 开发者:
代码是二进制世界的交流方式,极致的代码是我们的荣耀。
2017年春天,《阿里巴巴Java开发手册》发布,我们希望在涵盖编程规约、异常日志、单元测试、安全规约、 MySQL 数据库、工程规约、设计规约等7个维度上为开发工作提供一点帮助。
目前已有超过260万位工程师下载及查阅手册,在数以千计的企业应用,手册成为受业界认可的开发规范。我们也有幸为全行业的研发效能、人才培养、系统稳定性作出力所能及的一点贡献。
两年来,Java开发者们热心参与,以帮助这本不够完美的手册日臻完善。曾有开发者追踪问题长达半年之久,反复探讨、论证其正确性。这样的开发者难以计数,也许相隔重洋,可能相逢不识,我们用代码确认一致的热爱,也让这本手册的价值超越了单一公司。
因此,我们决定将手册正式更名为《Java开发手册》,它属于所有参与其中的贡献者,也以此聊表我们对全球Java开发者的感谢。
同时在今天,时隔一年,《Java开发手册》正式推出更新版,涵盖史无前例的三大升级:
如何免费下载?
扫描上方二维码
免费下载《Java开发手册》最新版
新版手册有哪些值得关注的亮点?
首先是关于新增的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开发手册》提供过宝贵意见与建议的所有开发者,你们是读者,更是作者,这份荣誉属于你们!
One more thing,周一Java测试题的正确答案为“ BBBCB ”,大家可以在手册新版中找到解题思路。此外,6月27日,我们诚挚地邀请你与作者孤尽畅聊新版背后的故事,详解题目深意,并有多本Java好书相赠。
欢迎点击 “阅读原文” ,访问阿里云开发者社区,预约直播,下周三我们不见不散~
小彩蛋来啦!
对于时隔一年发布的《Java开发手册》最新版,你有哪些感想或建议?欢迎在留言区讨论分享,我们将挑选5位最用心的同学送出《码出高效》技术好书。
截止日期:6月25日
你可能还喜欢
点击下方图片即可阅读
关注 「阿里技术」
把握前沿技术脉搏
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- WordPress 4.9 Beta 2 发布,11月14日发布正式版
- WordPress 4.9 候选版2 发布,11 月 14 日发布正式版
- WordPress 4.9 Beta4 发布,11月14日发布正式版
- GNOME 3.26 发布 RC 版,预计 9 月 13 日发布正式版
- Ubuntu 18.04 首个 Beta 版发布,4 月 26 日发布正式版
- FreeBSD 12.0-RC2 发布,将于12月11日发布正式版
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beautiful Code
Greg Wilson、Andy Oram / O'Reilly Media / 2007-7-6 / GBP 35.99
In this unique work, leading computer scientists discuss how they found unusual, carefully designed solutions to difficult problems. This book lets the reader look over the shoulder of major coding an......一起来看看 《Beautiful Code》 这本书的介绍吧!
html转js在线工具
html转js在线工具
UNIX 时间戳转换
UNIX 时间戳转换