天天看点

Java编程思想精粹(九)-接口(下)

8 接口字段

接口的字段都自动 static  final ,所以成为了创建一组常量的方便工具。

在 Java 5 之前,这是产生与 C 或 C++ 中的 enum (枚举类型) 具有相同效果的唯一方式。所以你可能在 Java 5 之前的代码中看到

Java编程思想精粹(九)-接口(下)

自 Java 5 开始,我们有了更加强大和灵活的关键字 enum,那么在接口中定义常量组就显得没什么意义了。然而当你阅读遗留的代码时,在很多场合你还会碰到这种旧的习惯用法。

8.1 初始化接口中的字段

接口中定义的字段不能是“空 final”,但是可以用非常量表达式初始化。

Java编程思想精粹(九)-接口(下)

因为字段是 static 的,所以它们在类第一次被加载时初始化,这发生在任何字段首次被访问时。

这些字段不是接口的一部分,它们的值被存储在接口的静态存储区域中。

9 接口嵌套

接口可以嵌套在类或其他接口中。

在类中嵌套接口就像非嵌套接口一样,具有 public 或包访问权限的可见性。

作为一种新添加的方式,接口也可以是 private 的,例如 A.D(同样的语法同时适用于嵌套接口和嵌套类)。

但 private 嵌套接口有什么好处呢?

你可能猜测它只是被用来实现一个 private 内部类,实现 private 接口是一种可以强制该接口中的方法定义不会添加任何类型信息(即不可以向上转型)的方式。

接口中的元素必须是 public 的——所以嵌套在另一个接口中的接口自动就是 public 的

Java编程思想精粹(九)-接口(下)

不能指明为 private

Java编程思想精粹(九)-接口(下)

当实现某个接口时,并不需要实现嵌套在其内部的接口。

同时,private 接口不能在定义它的类之外被实现。

添加这些特性的最初原因看起来像是出于对严格的语法一致性的考虑,但是我通常认为,一旦你了解了某种特性,就总能找到其用武之地。

10 接口和工厂方法模式

接口是多实现的途径,而生成符合某个接口的对象的典型方式是工厂方法设计模式。

不同于直接调用构造器,只需调用工厂对象中的创建方法就能生成对象的实现——理论上,通过这种方式可以将接口与实现的代码完全分离,使得可以透明地将某个实现替换为另一个实现。

如果没有工厂方法,代码就必须在某处指定将要创建的 Service 的确切类型,从而调用恰当的构造器。

为什么要添加额外的间接层呢?一个常见的原因是创建框架。

11 总结

认为接口是好的选择,从而使用接口不用具体类,这具有诱惑性。几乎任何时候,创建类都可以替代为创建一个接口和一个工厂。

很多人都掉进了这个陷阱,只要有可能就创建接口和工厂。这种逻辑看起来像是可能会使用不同的实现,所以总是添加这种抽象性。这变成了一种过早的设计优化。

任何抽象性都应该是由真正的需求驱动的。当有必要时才应该使用接口进行重构,而不是到处添加额外的间接层,从而带来额外的复杂性。这种复杂性非常显著,如果你让某人去处理这种复杂性,只是因为你意识到“以防万一”而添加新接口,而没有其他具有说服力的原因——好吧,如果我碰上了这种设计,就会质疑此人所作的所有其他设计了。

恰当的原则

优先使用类而不是接口。从类开始,如果使用接口的必要性变得很明确,那么就重构。

接口是一个伟大的工具,但它们容易被滥用。

往期推荐

程序员删库跑路?教你打造高可用的MySQL

从JVM 源码看init和clinit到底什么区别

使用SpringCloud三年,才知道@EnableEurekaServer注解到底有什么用

Netty源码面试解析实战(一)- 引导篇

http://mp.weixin.qq.com/s?__biz=MzUzNTY5MzA3MQ%3D%3D&chksm=fa80d67bcdf75f6dbb88642a1d56a315568a4dd6468482a9df448a88bf048b5f10c2bf00987e&idx=1&mid=2247484443&scene=21&sn=20db2cdcc0cfe47d98ee56ba1faf5680#wechat_redirect