3

在 Effective Java 第 17 条中,Josh Bloch 认为将静态成员放入接口(并实现该接口)是一种不好的做法,称为常量接口反模式

常量接口模式是接口使用不当。一个类在内部使用一些常量是一个实现细节。实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。类实现一个常量接口对类的用户来说无关紧要。事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一种承诺:如果在未来的版本中修改了类以使其不再需要使用常量,它仍然必须实现接口以确保二进制兼容性。如果一个非最终类实现了一个常量接口,那么它的所有子类的命名空间都会被接口中的常量污染。

Java 平台库中有几个常量接口,例如 java.io.ObjectStreamConstants. 这些接口应被视为异常,不应被模仿。

我非常有信心我理解这背后的原因并完全同意。

我的问题是:在接口与不可实例化类中对相关常量进行分组(注意:这些不适合枚举,请考虑相关常量 pi 和 e 的数学示例)是一个好主意,前提是您只访问这些值通过静态引用和静态导入,使用默认访问修饰符将接口隐藏在您的 API 中,并且从不实际实现接口

为什么或者为什么不?除了能够使用私有构造函数来确保永远不会实例化常量分组类型之外,将它们分组到一个类中还有什么好处吗?

4

1 回答 1

2

让我们换一种方式。对常量使用接口没有任何好处。如您所知,接口用于定义合同,而不是用于常量。例如,我没有看到将关键字更改interfaceclass关键字和使用public static final字段的问题。使用接口来保持常量从来都不是一个好主意。我认为人们使用这种反模式是因为他们不知道静态导入(它是在 中引入的Java 5.0),或者他们懒得在适当的类中分派他们的常量。相反,他们只创建一个接口并让每个类都实现它。

编辑:顺便说一句,这个问题听起来像 - 看电视是否是个好主意,用望远镜看附近的电视,前提是视力好。答案很简单——不,望远镜是为其他事物发明的。啊,我知道这个例子很愚蠢:)

于 2010-08-23T13:58:15.973 回答