在 Effective Java 第 17 条中,Josh Bloch 认为将静态成员放入接口(并实现该接口)是一种不好的做法,称为常量接口反模式:
常量接口模式是接口使用不当。一个类在内部使用一些常量是一个实现细节。实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。类实现一个常量接口对类的用户来说无关紧要。事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一种承诺:如果在未来的版本中修改了类以使其不再需要使用常量,它仍然必须实现接口以确保二进制兼容性。如果一个非最终类实现了一个常量接口,那么它的所有子类的命名空间都会被接口中的常量污染。
Java 平台库中有几个常量接口,例如
java.io.ObjectStreamConstants
. 这些接口应被视为异常,不应被模仿。
我非常有信心我理解这背后的原因并完全同意。
我的问题是:在接口与不可实例化类中对相关常量进行分组(注意:这些不适合枚举,请考虑相关常量 pi 和 e 的数学示例)是一个好主意,前提是您只访问这些值通过静态引用和静态导入,使用默认访问修饰符将接口隐藏在您的 API 中,并且从不实际实现接口?
为什么或者为什么不?除了能够使用私有构造函数来确保永远不会实例化常量分组类型之外,将它们分组到一个类中还有什么好处吗?