关于JDK 8的冷门观点 | AI生成和翻译
问题:关于 JDK 8 有哪些不受欢迎的观点?
回答:
JDK 8 于 2014 年发布,引入了像 lambdas、streams 和 Optional 类等变革性功能,许多开发人员称其为 Java 的里程碑。然而,它也引发了争议,一些观点挑战了炒作或强调了被忽视的缺陷。以下是整理自开发人员讨论(常在 Reddit 和 X (原 Twitter) 等论坛发表)的不受欢迎的观点列表。这些观点在对 JDK 8 功能编程添加的广泛赞誉中反映了少数人的看法。
-
JDK 8 的 lambdas 和函数式功能被过分吹捧,并没有真正将 Java 推向函数式编程的前沿。 批评者认为,虽然 lambdas 减少了样板代码,但与 Scala(在 JVM 上早于它们)或 Clojure 等语言相比,它们感觉像是硬塞进去的权宜之计,并且它们使带有受检异常的错误处理变得复杂。
-
Streams 功能强大,但导致代码难以阅读、过于抽象,并且比传统循环更难调试。 一些开发人员认为,链式 stream 操作以清晰度换取简洁性,尤其是在缺乏强大函数式编程经验的团队中,将简单的迭代变成了不透明的管道,容易在运行时出现意外。
-
Optional 是一个修复 null 的良好意图,但经常被误用,增加了冗余,却没有解决根本问题。 反对者说它鼓励将所有内容都包装在 Optionals 中,使 API 变得臃肿,并且没有在语言层面阻止 null——这些问题在 Kotlin 等后续版本中得到了更优雅的解决。
-
JDK 8 讽刺性地达到了 Java 简洁性的顶峰;后续版本因不兼容的更改而使其变得臃肿,使 8 成为“最后一个好”的版本。 一种反主流的观点是,JDK 8 的向后兼容性和简洁的核心使得 8 之后的升级(例如,9 中的模块)变得不必要地痛苦,导致遗留代码搁置并减缓了现代 Java 的 adoption。
-
接口中的默认方法破坏了多态性,并允许在没有显式覆盖的情况下进行行为更改,从而鼓励了糟糕的设计。 这个旨在简化库演进的功能,被一些人视为违反接口契约,导致脆弱的代码,其中实现无法预测超级接口的行为。
-
JDK 8 中 streams 的并行性在实际性能增益方面不可靠,并且由于开销通常更慢。 基准测试表明它在玩具示例中表现出色,但在异构工作负载中表现不佳,线程管理问题使其成为非专业人士的“自伤武器”——最好留给专门的库。
-
即使在 2025 年,坚持使用 JDK 8 仍然是明智且务实的选择,因为升级带来的收益递减且生态系统会损坏。 在现代化压力下,一些人认为 8 的成熟性、广泛的库支持和稳定性优于新的语法糖,尤其对于“只要没坏就不要修”的企业应用而言。
-
JDK 8 通过使 GC 暂停在函数式风格下更不可预测,加剧了 Java 的性能神话。 内存密集的 lambdas 和 streams,结合 8 的 G1 收集器,被指责导致高吞吐量系统中的抖动延迟,从而助长了“Java 慢”的刻板印象,尽管原始速度有所提高。
这些观点突出了 JDK 8 的双刃剑:创新但又分裂。虽然并非普遍存在,但它们强调了为什么一些开发人员仍然坚持使用 8 之前的版本或考虑 Kotlin 等替代方案。
参考文献:
- Love and hate for Java 8
- r/java: Java 8 – The Bad Parts
- r/java: Why most of the industry is still on Java 8?
- X Post: “the most important change to Java 8 is the new support for lambda expressions…”
- X Post: Unpopular opinion: stick to Java 8!