2011-03-23 51 views
3

最近我遇到了一段代码,其中我发现了一个与只有常量的接口。而那些常量是在使用静态导入的类中访问的。常数在数量上更多(大约30到50)。只有常数的接口

就我个人而言,我认为这不是一个好习惯。这就是为什么根据Effective Java被称为Constant Interface Antipattern。我没有找到任何合理的理由去进行这种编码。

此外,只有在应用程序中很少类需要导入少量常量时,才应该使用静态导入。

你们中的任何人都可以让我知道,如果有任何其他好的理由去只为常量接口?

+0

它不是很好,但通常没有简单的方法来收集大量的常量。你会认为什么是替代方案? (通常情况更糟;) – 2011-03-23 09:56:06

+0

@Peter Lawrey我们使用常量接口来存储jdbc存储过程名称。这是一个很好的例外,还是不好的做法? – 2011-03-23 09:59:58

+0

如果所有名称都具有相同的类型,并且它们都是相同类型的信息,那么@Suraj建议使用'enum'会更好。然而,根据我的经验,大多数接口常量更多是想要在类之间共享的幻数的随机集合。 – 2011-03-23 10:36:55

回答

5

当然,在引入枚举之前,如果有大量常量需要在多个类之间共享,那么Constant Interface可能是最实用的方法。

如果这些常量只用于一个类,那么其他答案中的注释('避免的模式')是非常有效的 - 如果由使用它们的类声明,它们将非常有用。

随着更新版本的Java,我会向具有允许设置值的构造函数的枚举转移。然而,如果一组值只用于一个类,那么最好在该类中声明它们,而不是单独声明它们。

+0

最近我碰到一个枚举,它只有一个分号,它缺少一个包 - 私有构造函数(就像你通常看到的枚举)。因此,用户在这个枚举中加入了公共的静态最终变量,但似乎他们只是使用一个接口,如果这是他们所要做的。或者,还有更好的方法?如果他们不打算使用枚举的实例构造函数,为什么要使用枚举? – djangofan 2016-12-16 17:18:50

3

如果这些常数进行一些逻辑分组,然后我可以使用一个枚举代替

+0

使用枚举获得什么?如果常量有不同的类型,这是如何工作的? – 2011-03-23 10:17:45

+0

枚举给你这么多。对于这个特定的例子,“类型安全”将是一个很大的问题。如果你知道常量接口反模式,那么你知道使用接口常量的一个缺点是“附带的运行时工件几乎没有实际用途”,因为运行时工件具有很多优点,因此enum – 2011-03-23 10:29:04

+0

@PeterLawrey“How如果常量具有不同类型,这是否工作?“?如果他们都构成了一些逻辑分组的一部分,那么你可以将你自己的类型本身枚举为 – 2011-03-23 10:31:14

2

我不喜欢这个成语在所有。为什么要将常量从它们使用的上下文中分离出来?我觉得很困惑。

这个设计强制一个类需要一个常量来实现一个完整的界面。所有这些常数都是公开的。

枚举的想法是一个很好的想法。除此之外的任何东西。

0

这个解决方案不是很大,但有时是有最好的选择所有常量都集中在一个地方,例如应用程序中使用的翻译键。

使用接口我们可以创建这些接口的完整存储并且不会复制它们。

0

完全没有。我会尽可能避免这种模式,在我的书中完全不是。我倾向于将常数保持在最有意义的位置,或者从OO的角度来看,它们属于哪个属性,并且很少将它们组合到一个接口中。

0

另一种选择(除了枚举)将是一个非instatiatable类(私人构造函数)收集常量如果枚举不适合(如字符串,整数等)。

另外,也许只有在使用它的地方才会使该类可见。

1

一个常见的选择是在工具类而不是接口中定义公共静态最终常量。把你的常量接口,重新定义为一个类,在每个声明中放置“public static final”,并引用这些由类名限定的变量,而不是通过实现接口。

我会倾向于认为一组常量与枚举不同。