Effective Java - 为后代设计接口
2022-06-05 本文已影响0人
DZQANN
第21条 为了后代设计接口
- 从Java 8开始,可以给接口加上方法,而不破坏现有的实现。
- 并不是永远都能写一个在任何情形下都适用的默认方法实现。比如
removeIf
,Apache的SynchronizedCollection
实现允许一个外部对象作为锁,如果使用removeIf
可能会抛出异常或者其他未知行为。 - 在有默认方法出现的时候,接口之前存在的实现可能可以通过编译,但是可能在运行时失败。
- 尽量避免利用缺省方法在现有接口上添加新的方法
思考
-
default
方法的主要作用更像是是为了给接口添加新方法的时候兼容老版本,所以我们尽量不要在一开始定义接口的时候就使用default
方法 -
default
方法的引入,使抽象类和接口的边界变得越来越模糊。个人感觉这种情形更应该选择的还是抽象类,理由就是接口的意义就是定义一组行为的集合,它应该只定义行为,不应该去定义实现。并且抽象类中可以定义属性,本身就更加适合加入方法的实现
第22条 接口只用于定义类型
-
常量接口是指:没有包含任何方法,只包含静态的final域,每个域都导出一个常量
-
常量接口模式是对接口的不良使用:
- 类在内部使用常量,就是实现细节
- 类实现了常量接口,对于这个类而言没有任何价值
- 对于一个已经实现了常量接口的类,未来实现改变不需要定义的常量值了,也不可以轻易的断开实现,因为需要保证兼容性
-
从Java7开始,下划线的使用已经合法了,对于数字的值没有任何影响:
public class Constants { public static final double ELECTRON_MASS = 9.109_383_56e-31; }
-
接口应该只被用来定义类型,不应该被用来定义常量
思考
-
interface
中定义的常量,一定是public static final
的,在使用上不如Constants类灵活 - 对于第2条说的几点原因,后面两点有些牵强。我们在开发中不会实现常量接口,就像我们不会继承常量类一样