Chapter 4 Class And Interface
类和接口是 Java 语言中最核心的抽象概念. 这章里的建议不是教你如何设计一个类 (这个是设计模式的内容), 而是给出一些通用的建议。
Item 13 Minimize the accessibility of classes and members
最小化类的可见度. 一个设计良好的模块应该尽量隐藏内部实现的细节, 接口和实现分离. 所以应该类和方法应该尽量降低自己的可见性. 特别是属性, 即使是 final 的属性也不应该是 public, 应该提供 getter 和 setter. 唯一的例外就是 static final 的属性.
这一条的原则是没有错的, 不过 Java 提供的三种可见性里并没有模块可见. 而更多的时候其实我们需要的是 module 内部的可见域. Kotlin 就提供了 internal 可见性, 只有 module 内部可见.
BTW: Java 一直想把模块化的方式标准化. OSGi 也使用了很多年, 不过 Oracle 更喜欢自己提出的 Jigsaw. 所以一直没有共识, 从 Java 7, Java 8 拖到现在的即将要出的 Java 9. Jigsaw 在最新的投票又被投了反对票. 所以 Java 9 到底能不能加入这功能还是一个未知数. Java 9 发布后, 带上了 Jigsaw.
Item 14 In Public classes, use accessor methods, not public fields.
总结:
- 在 Public 的类中不应该暴露任何可变的域.
- 对于不可变的域, 比如带 final 的基本类型的域可以考虑暴露, 但是最好不要.
- 对于包可见或者私有的类可以考虑直接暴露.
写 getter 和 setter 实在不是美好的体验, 虽然可以用 IDE 生成, 但是确实会很繁琐. 这里就不得不提一下 Kotlin 的 Property 实在是相当方便啊, Java 在语法糖上还是要加把劲啊.
Chapter 5 Generics
Java 的一个很重要的优点就是语法简单. 泛型可能是 Java 里唯一一个比较复杂的语法. 使用起来确实有很多需要注意的地方.
Item 25 Don't use raw types in new code
这个大家应该已经习惯.
Item 28 Use bounded wildcards to increase API flexibility
总结:
- 为了最大化 API 的灵活性. 在代表生产者或者消费者的输入参数中使用通配符类型. 要熟练使用 PECS 法则.
- 不要在返回值中使用通配符类型.
- 如果让类的使用者去思考关于通配符类型的问题, 那么 API 的设计里一定有一些错误.
- 如何类型参数, 只出现在方法声明中, 使用通配符类型来替代.
这一章中大概时本书中最有价值的一章. PECS 原则可以让自己少走很多弯路.