摆脱烂代码之Effective Java Third Edition

引:越学越迷茫,有所谓的重点吗?我反正现在还弄不清楚,既然弄不清楚,那就好好专注于脚下吧。我曾经看过一遍Effective Java第二版,可能那个时候的代码量还不够吧,不能理解其精髓,现在看看才能回味一点。刚好今年年初第三版(英文版)也出来,新增了Java7、8、9的一些条目,这里也就想列一些第三版的目录,供自己查找与实践,希望自己能够看到条目就能说出所以然来,也想翻译一下新增的一些条目。大家也可以互相交流。

第一章 引言(重要)

第二章 创建和销毁对象

第1条 考虑用静态工厂方法代替构造器(Java8,9 更新)

第2条 遇到多个构造器参数时要考虑用建造者模式

第3条 通过私有构造器或者枚举类型强化单例属性

第4条 通过私有构造器强化不可实例化的能力

第5条 依赖注入优先硬连接资源(新增)

第6条 避免创建不必要的对象(Java9 更新)

第7条 消除过期的对象引用

第8条 避免使用总结方法和清理器(Java 7,9 更新)

第9条 try-with-resources优先try-finally(Java 7 新增)

第三章 所有对象通用的方法

第10条 覆写equals时候请遵守通用规定

第11条 覆写equals时候总要覆写hashCode

第12条 始终覆写toString

第13条 谨慎得覆写clone

第14条 考虑实现Comparable接口

第四章 类和接口

第15条 使类和成员可访问性最小化(Java9 更新)

第16条 在公有类中使用访问方法而非公有域

第17条 使可变性最小化

第18条 复合优先于继承

第19条 要么为继承而设计并提供文档,要么禁止继承(Java8,9 更新)

第20条 接口优先于抽象类

第21条 为后代设计接口(Java8 新增)

第22条 接口只用于定义类型

第23条 类层次优先于标签类

第24条 优先考虑静态成员类而不是非静态成员类

第25条 将源文件限制为单个顶层类(新增)

第五章 泛型

第26条 不要使用原生类型

第27条 消除非首检警告

第28条 列表优先于数组

第29条 优先考虑泛型

第30条 优先考虑泛型方法

第31条 使用有界通配符提升API灵活性

第32条 谨慎组合泛型和可变参数(Java 7,9 新增)

第33条 优先考虑类型安全的异构容器

第六章 枚举和注解

第34条 用enum代替int常量

第35条 用实例域代替序数

第36条 用EnumSet代替位域

第37条 用EnumMap代替序数索引

第38条 用接口模拟可扩展的枚举

第39条 注解优于命名模式

第40条 坚持使用Override注解

第41条 标记接口定义类型

第七章 Lambda表达式和流

第42条 Lambda表达式优于匿名类(Java8 新增)

第43条 方法引用优于Lambda表达式(Java8 新增)

第44条 优先使用标准的函数式接口(Java8 新增)

第45条 谨慎使用流(Java8 新增)

第46条 在流中优先使用无副作用的函数(Java8 新增)

第47条 在返回类型中Collection优先于Stream(Java8 新增)

第48条 使用并行流的时候要小心(Java8 新增)

第八章 方法

第49条 检查参数的有效性(Java7 更新)

第50条 必要时进行保护性拷贝(Java8 更新)

第51条 谨慎设计方法签名

第52条 慎用重载

第53条 慎用可变参数

第54条 返回空集合或者数组,而不是null

第55条 谨慎返回Optional(Java8 新增)

第56条 为所有导出的API元素写文档注释(Java7,8,9 更新)

第九章 通用程序设计

第57条 将局部变量的作用域最小化

第58条 for-each循环优先于传统for循环

第59条 了解和使用类库(Java7,9 更新)

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

第61条 基本类型优先于装箱基本类型

第62条 如果有其他类型更合适,则尽量避免使用String

第63条 当心String连接的性能

第64条 通过接口引用对象

第65条 接口优先于反射机制

第66条 谨慎使用本地方法

第67条 谨慎地进行优化

第68条 遵守普遍接受的命名惯例

第十章 异常

第69条 只针对异常的情况才使用异常

第70条 对可恢复的情况使用受检异常,对编程错误使用运行时异常

第71条 避免不必要地使用受检异常

第72条 优先使用标准的异常

第73条 抛出与抽象相对应的异常

第74条 每个方法抛出的异常都要有文档

第75条 在细节消息中包含能捕获失败的信息

第76条 努力使失败保持原子性

第77条 不要顾略异常

第十一章 并发

第78条 同步访问共享的可变数据

第79条 避免过度同步

第80条 executors,task,stream优先于线程(Java7,8更新)

第81条 并发工具优先于wait和notify

第82条 线程安全文档化

第83条 慎用延迟初始化

第84条 不要依赖线程调度器(Java7 更新)

第十二章 序列化

第85条 其他选择优先于Java序列化(新增)

第86条 谨慎实现Serializable接口

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

第88条 保护性编写readObject方法

第89条 对于实例控制,枚举类型优先于readResolve

第90条 考虑用序列化代理代替序列化实例

参考

  1. Effective Java 第三版有什么新料 译
  2. 《Effective Java 第三版》新条目介绍