致全球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.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开发手册》提供过宝贵意见与建议的所有开发者,你们是读者,更是作者,这份荣誉属于你们!

文章转自于:「阿里技术」微信公众号

重磅:《Java 开发手册》全面发布,向全球开发者致敬!相关推荐

  1. 《阿里巴巴Java开发手册》发布一周年!你不知道的背后故事!

    摘要: 今天是2月9日,也是<阿里巴巴Java开发手册>(下称<手册>)对外正式发布一周年的日子.在过去的300多个日子里,这本小小的手册在业界产生了巨大的影响力.值此一周年之 ...

  2. 《阿里巴巴JAVA开发手册》发布详尽版,新增16条设计规约

    2018年6月5日,<阿里巴巴Java开发手册>再次升级代码规范,新增了16条设计规约! <阿里巴巴Java开发手册>是阿里内部Java工程师所遵循的开发规范,涵盖编程规约.单 ...

  3. 《Java 开发手册》重磅发布,向全球开发者致敬!

    本文来自:阿里技术(ali_tech) 致全球Java开发者: 代码是二进制世界的交流方式,极致的代码是我们的荣耀. 历经13个月之后,华山版<Java开发手册>现身江湖,新增21处,修改 ...

  4. 阿里巴巴《Java开发手册》2020最新版发布!

    致全球Java开发者: 代码是二进制世界的交流方式,极致的代码是我们的荣耀. 2017年春天,<阿里巴巴Java开发手册>发布,我们希望在涵盖编程规约.异常日志.单元测试.安全规约.MyS ...

  5. 《Java开发手册》2019最新版发布!

    致全球Java开发者: 代码是二进制世界的交流方式,极致的代码是我们的荣耀. 2017年春天,<阿里巴巴Java开发手册>发布,我们希望在涵盖编程规约.异常日志.单元测试.安全规约.MyS ...

  6. java web开发学习手册_【Java手册】Java开发手册_华山版(2019.06)

    版本号:1.5.0 更新日期:2019.06.19 制定团队:阿里巴巴与Java社区开发者 更新亮点:华山版,新增21条设计规约,修改描述112处,完善若干处示例 2017年春天,<阿里巴巴Ja ...

  7. 《Java开发手册》解读:大整数传输为何禁用Long类型?

    简介:最新发布的<Java开发手册(嵩山版)>增加了前后端规约,其中有一条:禁止服务端在超大整数下使用Long类型作为返回.这是为何?在实际开发中可能出现什么问题?本文从IEEE754浮点 ...

  8. 阿里巴巴《Java开发手册》2019最新版下载!

    2017年春天,<阿里巴巴Java开发手册>发布,在涵盖编程规约.异常日志.单元测试.安全规约.MySQL数据库.工程规约.设计规约等7个维度上为Java开发者提供了很多有用的帮助. 目前 ...

  9. 阿里《Java开发手册》最新嵩山版发布!

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

最新文章

  1. maven不能加载ojdbc14.jar的解决方法
  2. LESSON 9.4 集成算法的参数空间与网格优化
  3. 通过自定义ISAPI Filter来禁止敏感文件的访问
  4. 《WebForm开发系列之控件篇》Item2 ListBox
  5. 重磅发布 | 阿里云视图计算,边缘计算的主“战”场
  6. linux的IP配置
  7. 算法训练营 重编码_关于如何在没有训练营的情况下学习编码的10条提示
  8. 手机使用三年后不卡顿的有哪些牌子?
  9. 【小程序】一个提醒休息的小程序,供大家娱乐
  10. python实现webrtc接入ipc_WebRTC音视频会议的优势
  11. 1.ECMAScript 6简介(阮一峰ES6)
  12. FlashFXP 自动上传备份到指定FTP服务器的方法
  13. [Unity2D]实现人物动画帧的导入以及左右移动
  14. CS 3:威胁情报解决方案峰会——数据是威胁情报的基础
  15. 常量与十六进制数0x7f或0x3f做(与)运算含义
  16. 【nn.Parameter】Pytorch特征融合自适应权重设置(可学习权重使用)
  17. 关于网站嵌入faceboook以及youtube视频
  18. 计算机作文 六年级,我和电脑600字_六年级作文_小学作文 - 265学校教育网
  19. 华为p40pro手机计算机在哪里,一文看懂华为P40/P40 Pro差别在哪
  20. GPU编程 CUDA C++ 数组归约的示例和解释

热门文章

  1. 论文笔记《Combining Events and Frames Using Recurrent Asynchronous Multimodal Networks for Monocular ...》
  2. 正则匹配过滤字母和数字
  3. 防止padding撑开盒子的方法
  4. 解决WiFi信号弱小妙招
  5. python绘制曲线y=2x+5_Python绘制简易的二维图像
  6. 深度学习语义分割论文笔记(待完善)
  7. 计算机导航辅助教程,计算机导航辅助技术带给骨肿瘤外科医生的思考
  8. Tableau权限设置
  9. Word里面的文字怎么批量替换
  10. 涂鸦Zigbee SDK开发系列教程——2.环境搭建