JDK11 的 11 个谜题:Hanno Embregts 在 Devoxx UK 阐述对 Java 认证的理解

2022 年 5 月 31 日 InfoQ

作者 | Olimpiu Pop
译者 | 张卫滨
策划 | 丁晓昀

Hanno Embregts 向 Devoxx 的听众分享了他在获得 Oracle Java 11 认证的过程中学到的 11 件”疯狂的事情“。尽管他已经有接近 15 年的职业生涯,但他依然会吸收 Java 中这些新奇的东西,并将它们作为日后惯常的实践。

当被问到认证过程中的最大收获时,Embregts 说到:

在自己的编码世界里面,尽管我觉得已经到了很高超的水准,但是我依然意识到作为专业的开发人员,我们需要投入时间来不断丰富对所使用工具的知识。这将会提高我们的生产力。

由于开发人员喜欢潜心研究代码,所以这个演讲没有展示讲义,而是展示了 11 个单元测试(UT),其中每个 UT 代表了一个“谜题”。

谜题 11:数组类型定义

  • 组合使用本地类型推断和 [] 会导致无法编译

  • C 风格的数组定义需要针对每个变量重复进行,它是不可复制的。

谜题 10:流排序只针对 Comparable 对象有效

如果你尝试对一个对象的流进行排序,而目标对象不是 Comparable(也就是实现了 compareTo(...) 方法)对象的话,那么将会抛出 RuntimeException。

谜题 9:接口中的静态方法只允许在包含该方法的接口中进行调用

如果从类中尝试访问接口的静态方法将无法编译通过。

谜题 8:在枚举中创建匿名子类来覆盖枚举的功能

不要覆盖定义在枚举中的方法,这有可能会产生意料之外的行为。为了确保达到预期的效果,这些方法可以而且需要在匿名内类中进行重写。

谜题 7:根据不同的类型,除以零会有不同的行为

对于 int 或 long 类型,除以数字零会抛出一个 ArithmeticException,但是如果使用浮点数(float 或 double)的话,将会得到 POSITIVE_INFINITY。

谜题 6:方法重载参数的优先级因所使用类型的不同而不同

当编译器无法找到准确的类型时,它将扩展至更广泛的原始类型,如果原始类型也不可用的话,它将会尝试装箱原始类型或可变参数(varargs)。

谜题 5:如果 Switch 语句试图涵盖多个场景的话,可能会产生令人疑惑的结果。使用“|”操作符来涵盖两个不同的场景(case)可能会产生预料之外的结果,因为它会作为一个位操作符,而操作的结果会被 switch 语句用来匹配适当的类别。

谜题 4:处理克隆的数组、不可变集合和不可变类时的相等性

Java 的克隆操作是浅克隆,因此,它会指向与原始数组或集合中相同的对象。在这种情况下,使用“==”比较两个数组会产生 false,但是使用 Object.equals(...) 方法会生成 true。

谜题 3:数字化的包装器对象

为了进行优化,Java 将值在 -128 和 127 之间的数字进行了缓存。因此,这个范围的数字在装箱时,总会解析成相同的引用。

谜题 2:函数式接口

Java 中的函数式接口应该只有一个方法并且要使用 @FunctionalInterface 注解。

谜题 1:向方法引用传递参数

Embregts 认为,每天开车上下班不一定保证你能够成为一个专业的司机,每天编码也不能保证你成为一个专业的编码人员。因此,从这个角度出发,花费时间更深入地了解开发人员日常工作中使用的框架和语言,这将有助于提高编写代码的质量,避免某些操作出现意料之外的结果和棘手的 bug。这种类型的学习也可以帮助我们更具有生产力。

JDK 11 的采用率正在不断增长,到 2021 年底,它已经与 JDK 8 持平了。

作者简介:

Olimpiu Pop,软件工程师,拥有从金融软件到 IAM 的实际经验。热衷于工具化和优化开发流程。在欧洲 IDaaS 的 iWelcome 担任工程主管。Transylvania JUG 的组织者 -- 我很想做更多这样的事情。罗马尼亚 Voxxed 项目委员会成员,希望在不久的将来能成为演讲者。JavaAdventCalendar 的主编。

原文链接:

https://www.infoq.com/news/2022/05/11-puzzlers-jdk11/

点击底部阅读原文访问 InfoQ 官网,获取更多精彩内容!

今日好文推荐

10万 npm 用户账号信息被窃、日志中保存明文密码,GitHub安全问题何时休?

我们用了一个周末,将 370 万行代码迁移到了 TypeScript

阿里一季度员工减少4000人;程序员写脚本抢挂疫苗号,牟利40万被刑拘;搜狐遭遇史诗级邮件诈骗,张朝阳回应 | Q资讯

转载阿里开源框架Egg.js文档被告知侵权,原作者:难道我才是那个恶人?

点个在看少个 bug 👇

登录查看更多
0

相关内容

【Manning新书】C++并行实战,592页pdf,C++ Concurrency in Action
【2020新书】Python专业实践,250页pdf,Practices of the Python Pro
【Java实现遗传算法】162页pdf,Genetic Algorithms in Java Basics
专知会员服务
43+阅读 · 2020年7月19日
【Manning2020新书】Elm 实战,344页pdf,Elm in Action
专知会员服务
49+阅读 · 2020年4月14日
为什么每一名程序员都应该学习 C++?
InfoQ
0+阅读 · 2022年4月26日
JavaScript遭嫌弃,“反JS”主义者兴起
CSDN
0+阅读 · 2022年3月8日
那些有用但不为大家所熟知的 Java 特性
InfoQ
0+阅读 · 2022年2月15日
那些有用但不为大家所熟知的Java特性
AI前线
0+阅读 · 2022年2月8日
Flutter 如何与 Native (Android) 进行交互 | 开发者说·DTalk
深入理解强化学习,看这篇就够了
PaperWeekly
5+阅读 · 2021年11月28日
Room & Kotlin 符号的处理
谷歌开发者
0+阅读 · 2021年11月4日
Java单元测试技巧之JSON序列化
阿里技术
0+阅读 · 2021年10月20日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
1+阅读 · 2008年12月31日
Arxiv
0+阅读 · 2022年7月29日
Arxiv
0+阅读 · 2022年7月28日
Arxiv
0+阅读 · 2022年7月27日
Arxiv
0+阅读 · 2022年7月27日
VIP会员
相关资讯
为什么每一名程序员都应该学习 C++?
InfoQ
0+阅读 · 2022年4月26日
JavaScript遭嫌弃,“反JS”主义者兴起
CSDN
0+阅读 · 2022年3月8日
那些有用但不为大家所熟知的 Java 特性
InfoQ
0+阅读 · 2022年2月15日
那些有用但不为大家所熟知的Java特性
AI前线
0+阅读 · 2022年2月8日
Flutter 如何与 Native (Android) 进行交互 | 开发者说·DTalk
深入理解强化学习,看这篇就够了
PaperWeekly
5+阅读 · 2021年11月28日
Room & Kotlin 符号的处理
谷歌开发者
0+阅读 · 2021年11月4日
Java单元测试技巧之JSON序列化
阿里技术
0+阅读 · 2021年10月20日
相关基金
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
1+阅读 · 2008年12月31日
Top
微信扫码咨询专知VIP会员