Java 用于静态列表的接口或类?
我正在维护一些Java代码,这些代码利用一个接口(我们称之为BunchOfConstants)来简单地存储大量的公共静态final字符串。有时,这些字符串名称会更改或添加/删除字符串名称。(维修时会有点头痛) 此接口当前唯一的用途是在以后的大型丑陋的if/then构造中与输入进行比较,如下所示:Java 用于静态列表的接口或类?,java,interface,iterator,constants,Java,Interface,Iterator,Constants,我正在维护一些Java代码,这些代码利用一个接口(我们称之为BunchOfConstants)来简单地存储大量的公共静态final字符串。有时,这些字符串名称会更改或添加/删除字符串名称。(维修时会有点头痛) 此接口当前唯一的用途是在以后的大型丑陋的if/then构造中与输入进行比较,如下所示: if(BunchOfConstants.CONSTANT1.equals(whatImLookingFor)){ doSomeStuff(whatImLookingFor) }else if(B
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中存储这些数据的类会更优雅
我不明白为什么最初的开发人员决定在这个设计中使用一个接口,因为这个接口实际上从未在任何地方实现过。有人有什么意见吗
您是否同意,将这些成员作为常量的迭代类更合适?
,我将考虑使用常量为常数<强>不<强>类型安全(例如,它们只是int或字符串等)。p> 我建议您使用属性文件来存储所有常量。这样,您可以按照问题中的建议将属性加载到HashMap中请注意,属性支持是java自带的:我认为这是使用枚举的一个很好的选择。然后获取myenum.values(),然后对值应用for each循环。嗯,这看起来像常量接口反模式,可能不应该使用。使用枚举可能是一种建议的方法,或者至少使用带有私有构造函数的最终类
如果您想根据输入字符串对
,否则将处理“未找到”的情况。doSomeStuff
case
,也没有default
块)doSomeStuff()
工厂。为此,您必须将doSomeStuff()
实现包装在单独的操作类中,并且您可以静态地或从属性文件配置工厂。(通过常量值->操作类映射)。这是最具“进取心”的解决方案,这意味着尽管它看起来很漂亮,而且非常灵活,但在很多情况下,这是一种过火的解决方案嗯,枚举是一种方法。。。但是,如果“dosomestuff”在语义上依赖于特定的值,那么为什么不向枚举本身添加一个“dosomestuff”方法呢。这就是Java枚举的一个优点——它们不仅仅是数据,而且作为所有好的对象,它们都具有语义。然后,您只需在调用dosomestuff(whatiamlooking for)的枚举上循环,然后发生任何事情。很难说。 是的,我同意,它会更优雅——至少对你来说是这样。但是想想,下一个程序员会怎么想。这将更加复杂。
前面提到的策略模式和java的enum肯定是更好的解决方案,但由于您正在维护这段代码,我不确定您的老板是否会对耗时的重构感到满意。我的建议是使用enum,而不是太大的代码更改 不管怎样,我还是要联系原始开发者,问他们为什么?我承认一个巨大的if/then是原始的,但我感觉要么是最初的开发人员自己尝试过,遇到了麻烦,要么就是他们不知道更好的方法。。。简而言之,试一下iterable类,看看它是否工作(更好)。不幸的是,我没有能力联系原始开发人员。我将尝试一下枚举模型。因为接口没有在代码中的任何地方实现,我看不到任何直接的问题…我投票结束这个问题,因为我喜欢属性文件的想法,但我们的包已经使用了很多。我想我想探索一种基于类的解决方案,这很有意义。该软件包在1.5版本可用之前已编码。我想我会使用枚举方法。在这种情况下,工厂可能有点过火,但将来可能值得考虑,而属性文件解决方案正是您所说的问题。非常感谢。