每一个优秀的Java程序员都应该掌握的90条编程法则

经典Jolt 获奖作品Effective Java的第3版,从Java 5 到Java 9的种种特性,Java 开发人员不可缺少的一本参考书:Effective Java中文版(原书第3版),2024全新译本,豆瓣原版评分9.6,中文版9.8。

作者约书亚.布洛克(Joshua Bloch)是美国卡内基-梅隆大学教授,曾是Google公司首席Java架构师、Sun公司杰出工程师和Transarc公司高级系统设计师。他带领团队设计和实现过无数的Java平台特性,包括JDK 5.0语言增强版和获奖的Java Collections Framework。他拥有哥伦比亚大学的计算机科学学士学位和卡内基-梅隆大学的计算机科学博士学位。

Effective Java中文版(原书第3版)

Effective Java是Java程序员必读的书目。经典Jolt 获奖作品Effective Java的第3 版,对上一版进行了全面更新,涵盖了 从Java 5 到Java 9的种种特性,是Java 开发人员不可缺少的一本参考书。包含90 个条目,形式简洁。每个条目都讲述了对Java的独到见解, 阐明了如何编写高效、优雅的程序,并且提供了清晰、易懂的示例代码。

本书增加了 Lambda表达式、流、Optional类、接口默认方法、 try-with-resources、@SafeVarargs注解、模块等Java 7 及后续版本所引入的新特性。本书介绍了如何充分利用泛型、枚举、注解、自动装箱、for-each 循环、可变参数、并发机制等各种特性,帮助读者更加有效地使用Java编程语言及其基本类库(java.lang、java.util和http://java.io),以及子包(如java.util.concurrent和java.util.function等)。

本书并非面向 Java 初学者,而是要求读者有一定的Java 编程经验。对在 Java 开发方 面已经积累一定经验的读者而言,本书可以帮助其更深入地理解 Java 编程语言,以成为更 高效、卓越的 Java 开发人员。

本书共包含 90 个条目,每个条目都会讨论一条规则。这些规则体现了优秀且有经 验的程序员通常会坚持的一些有益做法。本书将这些条目大致划分为 11 个章节,每个 章节会涉及软件设计的某个具体方面。因此, 不一定需要按部就班地从头到尾阅读,每 个条目基本都是独立的。这些条目之间有很多交叉引用,因此可以轻松地找到自己需要 的内容。

自本书的上一个版本出版以来,Java 平台又增加了很多新特性。本书中的大部分条目 都以某种方式使用了这些特性。表 1-1 列出了这些主要特性会在哪些条目中讲解。

表 1-1 主要特性对应的条目

特 性条 目发 行
版 本
Lambda 表达式条目
42~44
Java 8
Stream 流条目
45~48
Java 8
Optional 类条目
55
Java 8
接口默认方法条目
21
Java 8
try-with-resources条目
9
Java 7
@SafeVarargs 注解条目
32
Java 7
Module 模块化条目
15
Java 9

大多数条目都会通过程序示例加以说明。本书有个突出的特点,就是包含了很多用来说明设计模式(Design Pattern)和习惯用法(Idiom)的代码示例。

许多条目还会包含一个或多个程序示例,用来说明在实践中应该避免的做法。这类例 子,有时被称为反模式(Antipattern),在注释中会被清楚地标注为“// 不要这样做!”。在 每一种情况下,对应的条目都会解释为什么这样做不好,并提供替代方案。

本书不适合初学者,而是假设读者已经熟悉 Java。如果你还不熟悉,可以考虑选择一 本优秀的 Java 入门书,如彼得 ·塞斯措夫特(Peter Sestoft)的 Java Precisely 。 本书适合任何有 Java 基本知识的人阅读,同时也能使高级程序员从中得到启发。

本书中的大多数规则都源于几条基本原则。清晰性和简洁性最为重要:组件的行为不能使用户感到意外。组件应该尽可能小,但也不能过小。①代码应该被复用,而不是被复制。 组件之间的依赖性应保持在最低限度。错误越早被检测出来越好,最好是在编译时就被发 现并解决。

虽然本书中的规则并不能百分之百适用于任何情况,但它们确实是绝大多数情况下的 最佳编程实践。你并不应该一味遵循这些规则,但是如果偶尔需要打破它们,也一定要有 充分的理由。学习编程的艺术,就像学习其他大多数学科一样,都是先学习规则,然后再 学习何时打破这些规则。

本书的大部分内容并不是讨论性能的,而是关注如何编写出清晰、正确、可用、健壮、 灵活和可维护的程序。如果能够编写出这样的程序,那么要得到所需要的性能,往往也就 比较简单了)。有些条目确实讨论了性能问题,有的还提供了性能数据。这些数 据,书中会加上“在我的机器上”这样的字样,因此最多只能将其视作近似值。

本书也使用了一些与《Java 语言规范:基于 Java SE 8》不同的术语。例如, 本书会将 继承(inheritance)用作子类化(subclassing)的同义词。本书没有对接口使用继承这一术 语,而是简单地表达为一个类实现(implement)了一个接口,或者一个接口扩展(extend) 了另一个接口。对于没有指定访问级别的情况,本书会使用传统的包私有(package-private) 这个术语,而没有使用技术上更严谨的包访问(package access )[JLS, 6.6.1]。

本书还使用了一些在《Java 语言规范:基于 Java SE 8》中没有定义的术语。术语导出 API(exported API),或者简单地说就是 API,指的是类、接口、构造器、成员以及序列化 形式(serialized form),程序员可以通过它们访问类、接口或者包。 使用 API 编写程序的程序员,称为该 API 的用户(user )。如果某个类的实现中用到了一个 API,则称该类为这 个 API 的客户端(client)。

类、接口、构造器、成员和序列化形式统称为 API 元素(API element)。导出 API 由 所有可在定义这个 API 的包之外访问的 API 元素构成。任何客户端都可以使用这些 API 元 素,而 API 的创建者负责支持它们。并非巧合的是,Javadoc 工具在其默认操作模式下生 成的文档中也会包含这些元素。笼统地讲,一个包的导出 API,是由该包中的每个公有(public)类或接口中公有的和受保护的(protected)成员及构造器组成的。

Java 9 向 Java 平台引入了模块系统(module system)。如果一个类库使用了模块系统, 其导出 API 就是该类库的模块声明导出的所有包的导出 API 的组合。

掌握90条编程法则让你成为优秀的java程序员

1:用静态工厂方法代替构造器

2:当构造器参数较多时考虑使用生成器

3:利用私有构造器或枚举类型强化Singleton属性 13

4:利用私有构造器防止类被实例化

5:优先考虑通过依赖注入来连接资源

6:避免创建不必要的对象

7:清除过期的对象引用

8:避免使用终结方法和清理方法

9:与try-finally相比,首选try-with-resources

10:在重写equals方法时要遵守通用约定

11:重写equals方法时应该总是重写hashCode方法

12:总是重写toString方法

13:谨慎重写clone方法

14:考虑实现Comparable接口

15:最小化类和成员的可访问性

16:在公有类中,使用访问器方法,而不使用公有的字段

17:使可变性最小化

18:组合优先于继承

19:要么为继承而设计并提供文档说明,要么就禁止继承

20:与抽象类相比,优先选择接口

21:为传诸后世而设计接口

22:接口仅用于定义类型

23:优先使用类层次结构而不是标记类

24:与非静态成员类相比,优先选择静态成员类

25:将源文件限制为单个顶层类

26:不要使用原始类型

27:消除unchecked类型的警告

28:列表优先于数组

29:首选泛型类型

30:首选泛型方法

31:使用有限制的通配符增加API的灵活性

32:谨慎混用泛型和可变参数

33:考虑类型安全的异构容器

34:使用enum代替int常量

35:使用实例字段代替序号

36:使用EnumSet代替位域

37:不要以序号作为索引,使用EnumMap代替

38:使用接口模拟可扩展的枚举

39:与命名模式相比首选注解

40:始终使用Override注解

41:使用标记接口来定义类型

42:与匿名类相比,优先选择Lambda表达式

43:与Lambda表达式相比,优先选择方法引用

44:首选标准的函数式接口

45:谨慎使用流

46:在流中首选没有副作用的函数

47:作为返回类型时,首选Collection而不是Stream

48:将流并行化时要谨慎

49:检查参数的有效性

50:必要时进行保护性复制

51:仔细设计方法签名

52:谨慎使用重载

53:谨慎使用可变参数

54:返回空的集合或数组,而不是null

55:谨慎返回Optional

56:为所有导出的API元素编写文档注释

57:最小化局部变量的作用域

58:与传统的for循环相比,首选for-each循环

59:了解并使用类库

60:如果需要精确的答案,避免使用float和double

61:首选基本类型,而不是其封装类

62:如果其他类型更适合,就不要使用字符串

63:注意字符串拼接操作的性能

64:通过接口来引用对象

65:与反射相比,首选接口

66:谨慎使用本地方法

67:谨慎进行优化

68:遵循普遍接受的命名惯例

69:异常机制应该仅用于异常的情况

70:对于可恢复的条件,使用检查型异常;对于编程错误,使用运行时异常

71:避免不必要地使用检查型异常

72:优先使用标准异常

73:抛出适合于当前抽象的异常

74:将每个方法抛出的所有异常都写在文档中

75:将故障记录信息包含在详细信息中

76:努力保持故障的原子性

77:不要忽略异常

78:同步对共享可变数据的访问

79:避免过度同步

80:与线程相比,首选执行器、任务和流

81:与wait和notify相比,首选高级并发工具

82:将线程安全性写在文档中

83:谨慎使用延迟初始化

84:不要依赖线程调度器

85:优先选择其他序列化替代方案

86:在实现Serializable接口时要特别谨慎

87:考虑使用自定义的序列化形式

88:保护性地编写readObject方法

89:对于实例受控的类,首选枚举类型而不是readResolve

90:考虑使用序列化代理代替序列化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/641119.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-manage-system 版本更新,让开发更加简单

vue-manage-system 近期进行了一次版本升级,主要是支持了更多功能、升级依赖版本和优化样式,并且上线了官方文档网站,大部分功能都有文档或者使用示例,更加适合新手上手开发,只需要根据实际业务简单修改,就…

跟着Datawhale重学数据结构与算法(3)---排序算法

开源链接:【 教程地址 】【电子网站】 【写博客的目的是记录自己学习过程,方便自己复盘,专业课复习】 数组排序: #mermaid-svg-F3iLcKsVv8gcmqqC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16p…

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错,是由于系统叫老yum源存在问题 处理方法 更换下述yum源,可以将其他repo源文件备份移动到其他目录,添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

A Neural Span-Based Continual Named Entity Recognition Model

《A Neural Span-Based Continual Named Entity Recognition Model》------------AAAI’23 论文链接:https://arxiv.org/abs/2302.12200 代码:https://github.com/Qznan/SpanKL 当前问题: 1.现有的NER模型在适应新的实体类型时往往表现不佳…

网站被SmartScreen标记为不安全怎么办?

在互联网时代,网站的安全性和可信度是用户选择是否继续访问的重要因素之一,然而,网站运营者偶尔会发现使用Edge浏览器访问网站时,会出现Microsoft Defender SmartScreen(以下简称SmartScreen)提示网站不安全…

element plus:tree强制更新

使用element plus的tree组件,做大屏设计器的图层列表,在左边的tree里和中间的编辑器里都可以右键上下移动图层,但是我遇到一个问题,往编辑器里增加组件,这种较大的变动,tree的渲染可以立马同步更新&#xf…

活动报名 | 如何进行全增量一体的异构数据库实时同步

伴随着新技术的不断涌现,市场竞争也在不断开辟新的角斗场——新的业务需求,新的应用设想都在这里迸发。 面对如此日新月异的竞争环境,企业的当务之急,是为新应用扎根准备好随时可取、准确一致的高质量数据土壤。在这样的背景下&a…

python基础语法--列表

一、列表的概念 列表(List)是一种有序、可变、允许重复元素的数据结构。列表用于存储一组相关的元素,并且可以根据需要动态地进行增加、删除、修改和访问。以下是列表的主要特点和操作: 有序性: 列表中的元素是按照它…

ROS 2边学边练(32)-- 初识tf2

前言 在上一篇文章当中我们已经用到了tf2,虽然有点懵,但所幸我们从这篇起将正式开始学习tf2,让它没有秘密可言。 动动手 我们依然是拿小海龟作为案例,简简单单走一遍流程,熟悉一下。 安装例子 安装例子及其依赖项。 …

如何使用 ArcGIS Pro 快速为黑白地图配色

对于某些拍摄时间比较久远的地图,限于当时的技术水平只有黑白的地图,针对这种情况,我们可以通过现在的地图为该地图进行配色,这里为大家讲解一下操作方法,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微…

Git | 分支管理

Git | 分支管理 文章目录 Git | 分支管理1、理解分支2、创建分支&&切换分支3、合并分支4、删除分支5、合并冲突6、分支管理策略合并分支模式实际工作中分支策略bug分支删除临时分支 1、理解分支 分支就类似分身。 在版本回退中,每次提交Git都会将修改以git…

【记录】Pandoc|Linux安装最新Pandoc

参考:官方文档,https://pandoc.org/installing.html 系统:Ubuntu 注意!Pandoc 不能接受 PDF 作为输入!!!如果是想下载 Pandoc 做 PDF 格式转换请放弃!! Linux 是 amd64 版…