Files
effective-Java/ch04类和接口/22.接口仅用来定义类型.md
2019-11-14 20:15:19 +08:00

19 lines
1.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 接口仅用来定义类型
一种失败的接口就是所谓的常量接口constant interface
这样的接口不包含任何方法; 它只包含静态 final 属性,每个输出一个常量。
使用这些常量的类实现接口,以避免需要用类名限定常量名。
**示例代码**[Item22Example01.java](ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example01.java):常量接口类 - **禁止这样使用!**
**常量接口模式是对接口的糟糕使用。** 类在内部使用一些常量,完全属于实现细节。实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。对类的用户来说,类实现一个常量接口是没有意义的。事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一个承诺:如果在将来的版本中修改了类,不再需要使用常量,那么它仍然必须实现接口,以确保二进制兼容性。如果一个非 final 类实现了常量接口,那么它的所有子类的命名空间都会被接口中的常量所污染。
Java 平台类库中有多个常量接口,如 `java.io.ObjectStreamConstants。` 这些接口应该被视为不规范的,不应该被效仿。
如果你想导出常量,有几个合理的选择方案。 如果常量与现有的类或接口紧密相关,则应将其添加到该类或接口中。
**示例代码**[Item22Example02.java](ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example02.java)Item22Example01.java 示例的工具类的版本。
总之,接口只能用于定义类型。 它们不应该仅用于导出常量。