【开卷系列】Effective Java

115 阅读3分钟
  1. 前言
  2. 创建和销毁对象
  • 2.1 用静态工厂方法代替构造器
  • 2.2 遇到多个构造器参数时要考虑使用构建器
  • 2.3 用私有构造器或枚举类型强化 Singleton 属性
  • 2.4 通过私有构造器强化不可实例化的能力
  • 2.5 避免创建不必要的对象
  • 2.6 消除过期的对象引用
  • 2.7 避免使用终结方法和清除方法
  1. 对于所有对象都通用的方法
  • 3.1 覆盖 equals 时请遵守通用约定
  • 3.2 覆盖 hashCode 时请遵守通用约定
  • 3.3 始终要覆盖 toString
  • 3.4 谨慎地覆盖 clone
  • 3.5 考虑实现 Comparable 接口
  1. 类和接口
  • 4.1 使类和成员的可访问性最小化
  • 4.2 在公有类中使用访问方法而非公有域
  • 4.3 使可变性最小化
  • 4.4 复合优先于继承
  • 4.5 要么为继承而设计,并提供文档说明,要么就禁止继承
  • 4.6 接口优于抽象类
  • 4.7 优先考虑静态成员类
  1. 泛型
  • 5.1 不要尝试编写泛型数组
  • 5.2 列表优先于数组
  • 5.3 优先考虑泛型方法
  • 5.4 优先考虑类型安全的异构容器
  1. 枚举和注解
  • 6.1 用 enum 代替 int 常量
  • 6.2 用实例域代替序数
  • 6.3 用 EnumSet 代替位域
  • 6.4 用接口模拟可伸缩的枚举
  • 6.5 注解优先于命名模式
  • 6.6 坚持使用 Override 注解
  • 6.7 消除过时的注解
  1. 方法
  • 7.1 检查参数的有效性
  • 7.2 必要时进行保护性拷贝
  • 7.3 返回零长度的数组或集合而不是 null
  • 7.4 谨慎地返回可变对象
  • 7.5 为所有导出的 API 元素编写文档注释
  • 7.6 覆盖方法时,不要忘记添加 @Override
  • 7.7 在公有类中使用接口定义类型
  • 7.8 避免使用原始类型
  • 7.9 优先使用标准异常
  • 7.10 抛出与抽象相对应的异常
  • 7.11 每个方法抛出的异常都要有文档
  1. 通用编程原则
  • 8.1 尽量少做转换
  • 8.2 必要时进行防御性拷贝
  • 8.3 必要时进行保护性暴露
  • 8.4 谨慎设计方法签名
  • 8.5 谨慎使用重载
  • 8.6 为 varargs 编写文档注释
  • 8.7 谨慎使用本地方法
  • 8.8 考虑使用函数对象表示策略
  • 8.9 了解和使用类库
  • 8.10 如果需要精度,就要避免使用 float 和 double
  1. 异常
  • 9.1 只针对异常的情况才使用异常
  • 9.2 对可恢复的情况使用受检异常,对编程错误使用运行时异常
  • 9.3 避免不必要地使用受检的异常
  • 9.4 慎重地使用异常链
  • 9.5 抛出与抽象相对应的异常
  • 9.6 在细节消息中包含能捕获失败的信息
  • 9.7 不要忽略异常
  1. 并发
  • 10.1 在共享可变数据时进行同步
  • 10.2 避免过度同步
  • 10.3 防止死锁和活锁
  • 10.4 谨慎地使用 wait 和 notify
  • 10.5 对于并发集合,优先考虑 ConcurrentHashMap 而不是同步的 HashMap
  • 10.6 了解并发库
  • 10.7 考虑使用 Executor、Task 和相关对象,而不是显式地创建线程
  • 10.8 线程安全性的文档化
  1. 序列化
  • 11.1 谨慎地实现 Serializable 接口
  • 11.2 考虑使用自定义的序列化形式
  • 11.3 内部类不要轻易地实现 Serializable 接口
  • 11.4 在实现 Serializable 时请考虑版本号
  • 11.5 考虑使用序列化代理代替序列化实例
  1. 总结
  • 12.1 将本书的建议付诸实践
  • 12.2 针对 Java 平台的未来发展持续关注