用于静态决赛列表的界面或类?

时间:2011-03-29 12:08:53

标签: java interface iterator constants

我正在维护一些利用接口的Java代码(让我们称之为BunchOfConstants)来简单地存储大量的公共静态最终字符串。有时,这些字符串名称会更改或添加/删除字符串名称。 (这对维持治疗会引起一些头痛)

此界面的唯一当前用途是在稍后的一个丑陋的if / then结构中比较输入:

if(BunchOfConstants.CONSTANT1.equals(whatImLookingFor)){
    doSomeStuff(whatImLookingFor)
}else if(BunchOfConstants.CONSTANT2.equals(whatImLookingFor)){
    doSomeStuff(whatImLookingFor)
}else if(BunchOfConstants.CONSTANT3.equals(whatImLookingFor)){
    doSomeStuff(whatImLookingFor)
}
...

我认为创建一个实现Iterable的类甚至是一个将这些数据存储在hashMap中的类会更优雅。

我无法弄清楚为什么原始开发人员决定使用这个设计的接口,因为接口从未在任何地方实际实现过。有没有人有任何意见?

您是否同意将这些成员作为常量的可迭代类更合适?

8 个答案:

答案 0 :(得分:5)

我会考虑使用enums,因为常量类型安全(例如,它们只是整数或字符串等)。

答案 1 :(得分:5)

使用枚举。然后获取myenum.values(),然后在值上应用for-each循环。

答案 2 :(得分:4)

我认为这是enum

的一个很好的候选人

答案 3 :(得分:4)

这(具有用于存储常量的专用接口)是在枚举时代之前存储常量的相当常见的方式。 (Pre Java 5次。)它为您节省了使用包含类名称为常量添加前缀的麻烦。我个人从来都不喜欢这种做法,但这就是人们做到这一点的原因。

至于什么可以替换为:

  1. 枚举和开关/案例构造。这需要最少的修改,但在可读性方面只有适度的好处。它确实为您提供了类型和值安全性,如果您忘记处理可能的值(对此没有case而对default阻止),您可以从IDE中收到警告。
  2. 属性文件。这显然只有在您不想根据常量值进行分支时才有效。 (即如果你的常量不必出现在你的源代码中。)这很重要,否则你最终会得到一个二级常量一个属性文件,这就像它得到了。
  3. doSomeStuff()工厂。为此,您必须将doSomeStuff()实现包装在单独的操作类中,并且可以静态配置工厂或从属性文件配置工厂。 (通过常量值 - >操作类映射)。这是最“企业化”的解决方案,这意味着虽然它看起来不错而且非常灵活,但很多时候它都是一种过度杀伤。

答案 4 :(得分:2)

嗯,这看起来像Constant Interface反模式,也许不应该使用。使用枚举可能是建议的方式,或者至少使用带有私有构造函数的final类。

如果您希望基于输入字符串为doSomeStuff提供不同的实现,您可能还会考虑使用策略模式,即拥有Map<String, Strategy>,然后查找whatImLookingFor的策略。如果您找到了策略,请执行其doSomeStuff,否则请处理“未找到”案例。

答案 5 :(得分:1)

我建议您使用属性文件来存储所有常量。这样您就可以按照问题中的建议将属性加载到HashMap中。

请注意,使用java本地提供属性支持:http://download.oracle.com/javase/1.5.0/docs/api/java/util/Properties.html

答案 6 :(得分:0)

好吧,枚举是可行的方法......但如果'dosomestuff'在语义上依赖于特定值,那么为什么不在enum本身添加'dosomestuff'方法。这就是Java枚举真的很棒 - 它们不仅仅是数据,而是所有好的对象,它们都有语义。然后你只需循环调用dosomestuff(whatIamLookingFor)的枚举,以及发生的任何事情。

答案 7 :(得分:0)

很难说。 是的,我同意,它会更优雅 - 至少对你而言。但想想,下一个程序员会考虑什么。它会更复杂。 之前提到的策略模式和java的枚举肯定是更好的解决方案,但由于你维护这段代码,我不确定你的老板是否会对耗时的重构感到满意。我的建议是使用枚举 - 不是那么大的代码更改。