《Java 开发手册》今日发布,向全球开发者致敬!

简介: 致全球Java开发者:

致全球Java开发者:

代码是二进制世界的交流方式,极致的代码是我们的荣耀。

2017年春天,《阿里巴巴Java开发手册》发布,我们希望在涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约等7个维度上为开发工作提供一点帮助。

目前已有超过260万位工程师下载及查阅手册,在数以千计的企业应用,手册成为受业界认可的开发规范。我们也有幸为全行业的研发效能、人才培养、系统稳定性作出力所能及的一点贡献。

两年来,Java开发者们热心参与,以帮助这本不够完美的手册日臻完善。曾有开发者追踪问题长达半年之久,反复探讨、论证其正确性。这样的开发者难以计数,也许相隔重洋,可能相逢不识,我们用代码确认一致的热爱,也让这本手册的价值超越了单一公司。

因此,我们决定将手册正式更名为《Java开发手册》,它属于所有参与其中的贡献者,也以此聊表我们对全球Java开发者的感谢。

image

同时在今天,时隔一年,《Java开发手册》正式推出更新版,涵盖史无前例的三大升级:

  • 1.新增21条新规约。比如,switch的空指针问题、浮点数的比较、无泛型限制引起的类型混乱、加锁与解锁的注意事项、YYYY的日期格式问题等;
  • 2.修改描述112处。比如,IFNULL的判断方式、集合的toArray的数组长度、日志占位符的处理等;
  • 3.完善若干处示例。比如,变量命名示例、卫语句示例、枚举示例、finally的return示例等。

如何免费下载?

image


扫描上方二维码

免费下载《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 判断。如下的代码输出是什么?

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

原文发布时间为: 2019-06-18
本文作者: 文末有彩蛋
本文来自云栖社区合作伙伴“ 阿里技术”,了解相关信息可以关注“ 阿里技术”。

相关文章
|
8天前
|
SQL Java 数据库连接
为何JDBC是Java开发者的“心头好”?原因竟然这么简单!
为何JDBC是Java开发者的“心头好”?原因竟然这么简单!
19 3
|
10天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
32 0
|
8天前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
Java开发者必知:JDBC连接数据库的“三大法宝”
13 7
|
9天前
|
Java 开发者 UED
“Java开发者必看:异步编程实战解析,掌握这些技巧,让你的代码跑得更快!
【8月更文挑战第30天】随着互联网技术的发展,系统性能和用户体验成为关注焦点。异步编程作为提高应用响应速度和吞吐量的技术,在Java中广泛采用。本文详细介绍了Java异步编程的概念与优势,并通过实战示例展示了如何利用Future、Callable及CompletableFuture在实际项目中实施异步编程,帮助开发者更好地理解和应用这一技术。
23 2
|
9天前
|
Java 开发者
Java 编程风格与规范:跟上时代热点,打造高质量代码,为开发者梦想保驾护航
【8月更文挑战第30天】本文强调了Java编程中代码质量和可维护性的重要性,详细介绍了命名规范、代码格式和注释的最佳实践,如使用描述性的命名、适当的缩进及空行,以及关键代码部分的注释说明,同时还提供了避免魔法值和减少代码重复的建议与示例,帮助提升团队协作效率和项目长期发展。
27 2
|
10天前
|
小程序 JavaScript Java
【资料】阿里Java开发手册
本文是关于分享阿里Java开发手册资源及促进编程规范学习的指南。作者以个人经历引入,讲述了公司领导通过细致讲解阿里Java开发手册,提升了团队对代码质量和编程规范的认识
143 0
【资料】阿里Java开发手册
|
15天前
|
Java 测试技术 开发者
掌握抽象类与接口的高级技巧!超越普通Java开发者
掌握抽象类与接口的高级技巧!超越普通Java开发者
24 2
|
19天前
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
|
20天前
|
安全 Java 测试技术
深入探讨Java安全编程的最佳实践,帮助开发者保障应用的安全性
在网络安全日益重要的今天,确保Java应用的安全性成为了开发者必须面对的课题。本文介绍Java安全编程的最佳实践,包括利用FindBugs等工具进行代码审查、严格验证用户输入以防攻击、运用输出编码避免XSS等漏洞、实施访问控制确保授权访问、采用加密技术保护敏感数据等。此外,还强调了使用最新Java版本、遵循最小权限原则及定期安全测试的重要性。通过这些实践,开发者能有效提升Java应用的安全防护水平。
27 1
|
20天前
|
搜索推荐 Java 程序员
在Java编程的旅程中,条件语句是每位开发者不可或缺的伙伴,它如同导航系统,引导着程序根据不同的情况做出响应。
在Java编程中,条件语句是引导程序根据不同情境作出响应的核心工具。本文通过四个案例深入浅出地介绍了如何巧妙运用if-else与switch语句。从基础的用户登录验证到利用switch处理枚举类型,再到条件语句的嵌套与组合,最后探讨了代码的优化与重构。每个案例都旨在帮助开发者提升编码效率与代码质量,无论是初学者还是资深程序员,都能从中获得灵感,让自己的Java代码更加优雅和专业。
11 1
下一篇
DDNS