mirror of
https://github.com/Jueee/effective-Java.git
synced 2025-03-14 03:10:42 +08:00
接口仅用来定义类型
This commit is contained in:
parent
2379035c3e
commit
69043c55bc
19
ch04类和接口/22.接口仅用来定义类型.md
Normal file
19
ch04类和接口/22.接口仅用来定义类型.md
Normal file
@ -0,0 +1,19 @@
|
||||
## 接口仅用来定义类型
|
||||
|
||||
一种失败的接口就是所谓的常量接口(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 示例的工具类的版本。
|
||||
|
||||
总之,接口只能用于定义类型。 它们不应该仅用于导出常量。
|
@ -0,0 +1,14 @@
|
||||
package com.jueee.item22;
|
||||
|
||||
// 常量接口类 - 禁止这样使用!
|
||||
public interface Item22Example01 {
|
||||
|
||||
// Avogadro's number (1/mol)
|
||||
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
|
||||
|
||||
// Boltzmann constant (J/K)
|
||||
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
|
||||
|
||||
// Mass of the electron (kg)
|
||||
static final double ELECTRON_MASS = 9.109_383_56e-31;
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package com.jueee.item22;
|
||||
|
||||
public class Item22Example02 {
|
||||
|
||||
private Item22Example02() { } // 防止实例化
|
||||
|
||||
public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
|
||||
public static final double BOLTZMANN_CONST = 1.380_648_52e-23;
|
||||
public static final double ELECTRON_MASS = 9.109_383_56e-31;
|
||||
}
|
Loading…
Reference in New Issue
Block a user