Effective Java 第三版更新详解

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(114)   2024-06-11 16:20:29

自从听说 Effective JavaThird Edition pending publication 以来,我一直想知道它会有什么新内容。我假设会涵盖自 Java 6 以来引入 Java 的功能,事实确实如此。但是,Java 开发人员经典的第三版还有一些其他变化。在这篇文章中,我提供了第三版中添加、重大更改或删除的主题的高级概述。

在列出我在Effective Java, Third Edition 中观察到的新内容之前,我需要做出免责声明,我可能会错过本书中的一些更改,这本书共有 12 章,包含 90项目涵盖超过 350 页。这篇文章无意详细介绍第三版中的变化,而是作为变化的高级示例,鼓励读者借用或购买《Effective Java》第三版的副本 以访问低级详细信息。

正如预期的那样,Effective Java,第三版中有重要的新内容与 Java 7Java 8 甚至 Java 9

Java 7

Java 7 推动的一个明显的新项目是项目 9(“Prefer try-with-resources to try-finally“)因为 try-with-resources 是在 Java 7 中引入的。 第 32 项(“明智地结合泛型和可变参数”)是第三版的新增内容,讨论了 Java 7 引入 @SafeVarargs 注释(它收到了一些 Java 9 的增强)。

第 8 项(“避免终结器和清洁器”)已更新以讨论如何使用 Java 7 - 引入的 AutoCloseable 在一些最常见的用法中替换终结器和清理器的接口。 第 49 项(“检查参数的有效性”)已更新为引用 Java 7 引入的 Objects.requireNonNull 方法。

Item 80(“Prefer executors, tasks, and streams to threads“)自 Effective Java 并包括关于将 Fork/Join 添加到 Java 7 中的 Executor 框架 的讨论。项目 59(“了解和使用库“)讨论了 Java 7 中引入的 ThreadLocalRandom

条目 56(“为所有公开的 API 元素编写文档注释”)讨论了添加到 -Xdoclintjavadoc 开关JDK 7 的命令行。

Java 8

第 21 项(“为后代设计界面“)涵盖了与在 Java 界面中使用默认方法相关的最佳实践>。整个第 7 章(“Lambdas and Streams”)正如其标题所描述的那样,与 Java 引入的lambdas and streams 相关8,由关于这些函数式编程概念的七个条目(条目 42条目 48)组成。 条目 55(“明智地返回可选值”)讨论了 Java 8 引入的 Optional 的正确使用。

Item 1(“考虑静态工厂方法而不是构造函数”)不是第三版中的新项目,但它现在讨论了 Java 8 支持的接口中的静态方法并在 Java 9 中得到增强。第 19 项(“为继承设计和记录否则禁止”)也不是新的,但现在提到了 Javadoc @implSpec “在 Java 8 中添加并在 Java 9 中大量使用”的标记。毫不奇怪,条目 56(“为所有暴露的 API 元素编写文档注释”)也讨论了 @implSpec 的使用。

第 50 项(“在需要时制作防御性副本”)并没有过多关注它(日期和时间不是该项目的重点),但确实参考了使用 Instant 而不是 Date

Java 9

Effective Java 第三版提供的与模块化Java 平台模块系统)相关的指导比我预期的要少,这可以说是许多人首先要做的事情我们中的许多人都与 Java 9 相关。项目 15(“最小化类和成员的可访问性”)讨论了“作为 模块系统。”

第 8 项(“避免终结器和清洁器”)在第二版中被简单地命名为“避免终结器”。在这个项目的标题中添加“和清洁器”反映了 Java 9 弃用了终结器(出于我太熟悉的原因)并将其替换为清洁类

条目 56(“为所有公开的 API 元素编写文档注释”)讨论了 Java 9 引入的 Javadoc 标签 {@index} 的使用。 条目 59(“了解和使用库”)讨论了添加到 InputStream 的方法 transferTo(OutputStream) > 与 Java 9 讨论为什么了解标准库中可用的内容很重要。

Item 6(“避免创建不必要的对象”)提到在 Java 9 中弃用了接受单个 String 参数的 Boolean 构造函数 作为说明在该项目中提出的观点。顺便说一句,唯一的其他 Boolean 构造函数 [Boolean(boolean)] 在 Java 9 中也被弃用了。

Effective Java,第三版解决了 Java 9 中对接口(Item 1)中的static 方法和Optional第 55 项)。 Item 19 还提到了 Java 9 对 $ 的大量使用。这三项中的每一项都在本文前面的“Java 8”部分中突出显示。

与版本无关的新通用 Java 项

Effective Java, Third Edition 中有一些新项目与第二版中涵盖的新版本的 Java 没有明显的联系。其中包括第 5 项(“首选依赖注入而不是硬连线资源”)、第 25 项(“将源文件限制在单个顶部-level 类“)和条目 85(“首选 Java 序列化的替代方法”)。我在我的博文“将 Google 的 Protocol Buffers 与 Java 结合使用”中详细介绍了第 85 项(“首选 Java 序列化的替代方案”)。

删除的项目和附录

Effective Java 第二版中的一项似乎已被完全删除。第三版有用的“附录”标题为“与第二版相对应的项目”,它表明单页项目73(“避免线程组“) 来自第二版,在第三版中已“退休”。本附录的结构也很容易识别第二版的第 21 条(“使用函数对象来表示策略”)在第三版中被 第 42 条(“首选 lambdas to匿名类”)。顺便说一句,这本书在任何版本中似乎都很少有错别字,但在第三版中一个突出的错字是附录中将第二版的第 69 项与第三版的第 81 项相关联的那一行版。

次要文本更新

Effective Java 第三版中的几项文本进行了较小的更新,其中一些在更改中具有重要意义。这些是最难说出来的,但我在这里举一个例子。在第二版中,Bloch 在括号中写道,与 StringBuilder 相比,StringBuffer“基本上已过时”,但在第三版中,这一措辞更加强烈地表明 StringBufferStringBuilder 的“过时的前身”。我完全同意对文本的更改。

介绍

Effective Java,第三版 中的 11 章包含构成“Java 平台最佳实践”的 90 个条目。但是,第 1 章(“简介”)很有价值,因为它将 Java 7、Java 8 和 Java 9 的“关键特性”与讨论这些关键特性的一个或多个条目以及引入这些关键特性的 Java 版本相关联。我希望我早点注意到它,但直到我基本完成这篇文章的撰写后才看到第 1 页上的这个方便的表格。该表可以为我节省大量时间来确定涵盖 Java 7、Java 8 和 Java 9 新功能的项目!

“引言”也值得一读,因为它列出了“本书中的大部分规则都源于这些基本原则”。我喜欢 Bloch 在引言中明确指出的,“这本书不适合初学者:它假定您已经熟悉 Java。”网上有无数的论坛和主题,人们在其中为 Java 新手索要一本好书。虽然我向中级和高级 Java 开发人员强烈推荐了各种版本的 Effective Java,但我始终认为初级 Java 开发人员最好阅读一本为学习 Java 而编写的书,然后应该阅读 < em>Effective Java 当他们了解核心概念并想知道如何尽可能清楚和简单地应用这些概念时。

总结

这篇博文重点介绍了第三版中 Effective Java 的一些最重要的添加和更改。但是,我只提到了一些对 Java 7、Java 8 和 Java 9 的快速参考,并且在我的总结中无疑遗漏了一些新的和更改的文本。为反映新版本的 Java 而对项目进行的一些小更改的引用旨在说明如何将新的 Java 功能融入多个项目中,这些项目乍一看似乎不一定与新版本的 Java 相关。

Effective Java 是我唯一购买过三本的书,但多年来,我现在每个版本都购买了一本,而且我并没有为此感到遗憾。 Effective Java 第三版不仅涵盖了 Java 7、Java 8 和 Java 9 的新特性,还增加了项目并更新了已有项目,以反映 Josh Bloch 对最佳实践的最新思考Java编程语言。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-whats-new-effective-javas-third-edition.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...