Java 对类之间共享的相关常量进行分组

Java 对类之间共享的相关常量进行分组,java,oop,effective-java,Java,Oop,Effective Java,在《有效Java》第17项中,Josh Bloch认为将静态成员放入接口(并实现该接口)是一种被称为常量接口反模式的糟糕做法: 常量接口模式是对接口的不当使用。那是一节课 在内部使用某些常量是一个 实施细节实施 常量接口导致了这种情况 要泄漏到 类的导出API。它没有 对类用户的后果 类实现了一个常量 接口。事实上,它甚至可能 把他们弄糊涂。更糟糕的是,它代表了一种 承诺:如果在将来的版本中 类已修改,因此它不再 需要使用常量,它仍然 必须实现接口以确保 二进制兼容性。如果一个非最终的 类实现一

在《有效Java》第17项中,Josh Bloch认为将静态成员放入接口(并实现该接口)是一种被称为常量接口反模式的糟糕做法:

常量接口模式是对接口的不当使用。那是一节课 在内部使用某些常量是一个 实施细节实施 常量接口导致了这种情况 要泄漏到 类的导出API。它没有 对类用户的后果 类实现了一个常量 接口。事实上,它甚至可能 把他们弄糊涂。更糟糕的是,它代表了一种 承诺:如果在将来的版本中 类已修改,因此它不再 需要使用常量,它仍然 必须实现接口以确保 二进制兼容性。如果一个非最终的 类实现一个常量接口, 它的所有子类都有自己的 被常量污染的名称空间 在界面中

java平台中有几个常量接口 图书馆,如
java.io.ObjectStreamConstants
。这些 接口应被视为 不应模仿异常和异常

我很有信心我理解这背后的原因,并完全同意

我的问题是:分组相关常数(注意:这些不适合枚举,考虑相关的常数Pi和E的数学例子)在接口与非实例化类中是一个好主意,<强> >只提供静态引用和静态导入的值,使用默认访问修饰符对API隐藏交互,并且永远不要实际实现接口


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

换言之。对常量使用接口没有任何好处。正如您所知,接口用于定义契约,而不是常量。我看不出将
接口
关键字更改为
关键字以及使用
公共静态最终
字段的问题。使用接口来保持常量从来都不是一个好主意。我认为人们之所以使用这种反模式,是因为他们不知道静态导入(它是在
Java5.0
中引入的),或者他们太懒了,以至于无法在适当的类中分派常量。相反,他们只是创建一个接口,让每个类实现它

编辑:顺便问一下,这个问题听起来像是——如果视野好的话,用望远镜看邻居家的电视是个好主意吗。答案很简单——不,望远镜是为其他目的而发明的。啊,我知道这个例子很愚蠢:)