Effective Java
Table of Contents
- 1. ☰
- 1.1. Meta Notes
- 1.2. Books
- 1.2.1. DONE Combo #1
- 1.2.2. INPROGRESS Combo #2
- 1.2.3. DONE JavaScript: The Good Parts
- 1.2.4. DONE Domain Specific Languages
- 1.2.5. INPROGRESS Effective Java
- 1.2.6. DONE Don't Make Me Think
- 1.2.7. DONE Clean Code
- 1.2.8. INPROGRESS Deep Learning
- 1.2.9. INPROGRESS Async JavaScript
- 1.2.10. INPROGRESS ng-book2
- 1.2.11. INPROGRESS Combo #3: SLAM
- 2. Intro
- 3. 第 1 章 引言
- 4. 第 2 章 创建和销毁对象
- 5. 第 3 章 对于所有对象都通用的方法
- 6. 第 4 章 类和接口
- 7. 第 5 章 泛型
- 8. 第 6 章 枚举和注解
- 9. 第 7 章 方法
- 10. 第 8 章 通用程序设计
- 10.1. 第 45 条:将局部变量的作用域最小化
- 10.2. 第 46 条:for-each 循环优先于传统的 for 循环
- 10.3. 第 47 条:了解和使用类库
- 10.4. 第 48 条:如果需要精确的答案,请避免使用 float 和 double
- 10.5. 第 49 条:基本类型优先于装箱基本类型
- 10.6. 第 50 条:如果其他类型更适合,则尽量避免使用字符串
- 10.7. 第 51 条:当心字符串连接的性能
- 10.8. 第 52 条:通过接口引用对象
- 10.9. 第 53 条:接口优先于反射机制
- 10.10. 第 54 条:谨慎地使用本地方法
- 10.11. 第 55 条:谨慎地进行优化
- 10.12. 第 56 条:遵守普遍接受的命名惯例
- 11. 第 9 章 异常
- 12. 第 10 章 并发
- 13. 第 11 章 序列化
- 14. 附录 第 1 版与第 2 版条目对照
- 15. 中英文术语对照
- 16. 参考文献
1 ☰
1.1 Meta Notes
1.2 Books
1.2.1 DONE Combo #1
1.2.3 DONE JavaScript: The Good Parts
1.2.4 DONE Domain Specific Languages
1.2.5 INPROGRESS Effective Java
1.2.6 DONE Don't Make Me Think
1.2.7 DONE Clean Code
1.2.8 INPROGRESS Deep Learning
1.2.9 INPROGRESS Async JavaScript
1.2.10 INPROGRESS ng-book2
1.2.11 INPROGRESS Combo #3: SLAM
2 Intro
- Effective Java (douban)
本书介绍了在 Java 编程中 78 条极具实用价值的经验规则,这些经验规则涵 盖了大多数开发人员每天所面临的问题的解决方案。通过对 Java 平台设计专 家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰、 健壮和高效的代码。本书中的每条规则都以简短、独立的小文章形式出现,并 通过例子代码加以进一步说明。本书内容全面,结构清晰,讲解详细。可作为 技术人员的参考用书。
2.1 译者序
2.2 序
2.3 前言
2.4 致谢
3 第 1 章 引言
4 第 2 章 创建和销毁对象
4.1 第 1 条:考虑用静态工厂方法代替构造器
- static factory method 的一大优势
- 有名字
- 可以不必每次都创建一个对象, 比如
Collections.emptyList()
每次都是取一个静态变量, 这个变量的类型还是一个简化的 List. - 可以返回子类型
- 如果 type inference 做得好, 还可以让代码更简洁. 比如
new ArrayList<>()
这样的语法
- 当然也有缺点, 1) 不能被继承; 2) 与其他静态方法没区别, 从语法上不像构造函数那样与众不同;
4.2 第 2 条:遇到多个构造器参数时要考虑用构建器
- 构造参数多了, 说明要配置的地方多, 用 builder 加上 fluent API 要简便得多
- 与其弄一个大而全的 ctor, 不如每次都只配置一个点, 最后再 build 出来一个对象
- 而且… 这种 builder 还能通过 lomock 之类的库, 加一个 annotation 就能自动生成 builder, 方便极了
4.3 第 3 条:用私有构造器或者枚举类型强化 Singleton 属性
- 静态 final public 对象可能被篡改
- 静态 private 加上一个 public 接口函数 (optionally 加上 lazy 初始化) 要靠谱些
- 比上面更靠谱的是 Enum 对象, 一个 Enum 和 Class, 定义上没啥区别, 都可以有函数, 但 Enum 里面可以定义一个对象 (像是一个 label)
4.4 TODO 第 4 条:通过私有构造器强化不可实例化的能力
4.5 第 5 条:避免创建不必要的对象
- Boolean.valueOf(ref) 几乎总是优于 new Boolean(ref), 字面量则更好
- lazily initialling
- map 对象返回 keySet 的时候总是返回同一个 object (不用担心性能问题)
- 小心 autoboxing, autounboxing
4.6 第 6 条:消除过期的对象引用
- weak reference
4.7 第 7 条:避免使用终结方法
- 如题
5 第 3 章 对于所有对象都通用的方法
5.1 第 8 条:覆盖 equals 时请遵守通用约定
- 这个 IDE 会帮你, 有一些原则
- 非空, reflexive (自反), symmetric (对称), transitive (传递性), consistent (一致性)
- TODO liskov substitution principle
5.2 第 9 条:覆盖 equals 时总要覆盖 hashCode
- equals 的东西, hashCode 应当一致
- hashCode 一致的 object, 不一定 equals
- 小心计算 hashCode 时候偷懒可能引起的性能问题, 比如 string 的 hashCode 以前用的是前 16 个字符 (Java 1.2 以前), 这样用来放 url 就严重地冲突了
5.3 第 10 条:始终要覆盖 toString
- 如题
5.4 第 11 条:谨慎地覆盖 clone
- 写成 VO 最好
- 提供 from 函数最好
- 用 copy ctor 也不错
- clone 大多数情况写没必要
- 不要试图实现这个接口, 麻烦死
5.5 第 12 条:考虑实现 Comparable 接口
- 泛型函数可能用到
- 其实看情况, 我觉得没必要实现, 因为 sort (举个例子) 的时候, 每次用到的 compare 原则可能不一样啊, 临时写一个也行的
- o1 < o2 / o1.compareTo(o2) < 0, 会升序排列
6 第 4 章 类和接口
6.1 第 13 条:使类和成员的可访问性最小化
- information hiding / encapsulation