致全球Java开发者:数据库
代码是二进制世界的交流方式,极致的代码是咱们的荣耀。编程
2017年春天,《阿里巴巴Java开发手册》发布,咱们但愿在涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约等7个维度上为开发工做提供一点帮助。设计模式
目前已有超过260万位工程师下载及查阅手册,在数以千计的企业应用,手册成为受业界承认的开发规范。咱们也有幸为全行业的研发效能、人才培养、系统稳定性做出力所能及的一点贡献。数组
两年来,Java开发者们热心参与,以帮助这本不够完美的手册日臻完善。曾有开发者追踪问题长达半年之久,反复探讨、论证其正确性。这样的开发者难以计数,也许相隔重洋,可能相逢不识,咱们用代码确认一致的热爱,也让这本手册的价值超越了单一公司。安全
所以,咱们决定将手册正式改名为《Java开发手册》,它属于全部参与其中的贡献者,也以此聊表咱们对全球Java开发者的感谢。并发
同时在今天,时隔一年,《Java开发手册》正式推出更新版,涵盖前所未有的三大升级:高并发
1.新增21条新规约。好比,switch的空指针问题、浮点数的比较、无泛型限制引发的类型混乱、加锁与解锁的注意事项、YYYY的日期格式问题等;单元测试
2.修改描述112处。好比,IFNULL的判断方式、集合的toArray的数组长度、日志占位符的处理等;测试
3.完善若干处示例。好比,变量命名示例、卫语句示例、枚举示例、finally的return示例等。阿里云
如何免费下载?
扫描上方二维码
免费下载《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.五、0.2五、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位最用心的同窗送出《码出高效》技术好书。
下载地址: