我正在维护一些利用接口的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中的类会更优雅。
我无法弄清楚为什么原始开发人员决定使用这个设计的接口,因为接口从未在任何地方实际实现过。有没有人有任何意见?
您是否同意将这些成员作为常量的可迭代类更合适?
答案 0 :(得分:5)
我会考虑使用enums
,因为常量不类型安全(例如,它们只是整数或字符串等)。
答案 1 :(得分:5)
使用枚举。然后获取myenum.values(),然后在值上应用for-each循环。
答案 2 :(得分:4)
我认为这是enum
的一个很好的候选人答案 3 :(得分:4)
这(具有用于存储常量的专用接口)是在枚举时代之前存储常量的相当常见的方式。 (Pre Java 5次。)它为您节省了使用包含类名称为常量添加前缀的麻烦。我个人从来都不喜欢这种做法,但这就是人们做到这一点的原因。
至于什么可以替换为:
case
而对default
阻止),您可以从IDE中收到警告。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的枚举肯定是更好的解决方案,但由于你维护这段代码,我不确定你的老板是否会对耗时的重构感到满意。我的建议是使用枚举 - 不是那么大的代码更改。