【发布时间】:2011-09-12 14:38:49
【问题描述】:
在他的书Effective Java 中,Joshua Bloch 建议不要使用接口来保存常量,
常量接口模式是对接口的不良使用。一个类在内部使用一些常量是一个实现细节。实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。类实现一个常量接口对类的用户来说无关紧要。事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一种承诺:如果在未来的版本中修改了类以使其不再需要使用常量,它仍然必须实现接口以确保二进制兼容性。如果一个非final类实现了一个常量接口,那么它的所有子类的命名空间都会被接口中的常量污染。
他的推理对我来说是有道理的,它似乎是每当提出问题时的主流逻辑,但它忽略了在接口中存储常量然后不实现它们。
例如,
public interface SomeInterface {
public static final String FOO = "example";
}
public class SomeOtherClass {
//notice that this class does not implement anything
public void foo() {
thisIsJustAnExample("Designed to be short", SomeInteface.FOO);
}
}
我与一直使用这种方法的人一起工作。我倾向于使用带有私有构造函数的类来保存我的常量,但我已经开始以这种方式使用接口来保持我们的代码风格一致。 是否有任何理由不按照我上面概述的方式使用接口?
本质上,它是一种简写方式,可以防止您必须将类设为私有,因为无法初始化接口。
【问题讨论】:
-
您有十多个未接受的问题。 ;)
-
简单地重构掉常量
interface类是不可能的吗?将常量移动到使用它们的类;将常用的移入enums。 -
@Peter Lawery,我可以为他们中的大多数人辩护。有时我会问一个问题并在尝试任何解决方案之前转向不同的东西,这对回答者来说是肯定的,但我赞成但不将任何东西标记为我没有亲自测试过的答案。有时我只是没有得到任何有用的答案,也没有时间回来写解决方案,所以问题保持开放。当我有空闲时间时,我将不得不尝试做一些簿记,但是最近没有时间或兴趣。
-
不确定你是否会给回答你问题的人留下深刻印象。 ;) 人们应该觉得你会提出可以合理回答的问题,并且你会跟进他们的贡献。
-
这是一个最佳实践问题,因此没有具体答案。我现在标记的是最同意的一个,但是其他答案也提出了很多其他好的观点。