Java 用于静态列表的接口或类?

Java 用于静态列表的接口或类?,java,interface,iterator,constants,Java,Interface,Iterator,Constants,我正在维护一些Java代码,这些代码利用一个接口(我们称之为BunchOfConstants)来简单地存储大量的公共静态final字符串。有时,这些字符串名称会更改或添加/删除字符串名称。(维修时会有点头痛) 此接口当前唯一的用途是在以后的大型丑陋的if/then构造中与输入进行比较,如下所示: if(BunchOfConstants.CONSTANT1.equals(whatImLookingFor)){ doSomeStuff(whatImLookingFor) }else if(B

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

此接口当前唯一的用途是在以后的大型丑陋的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中存储这些数据的类会更优雅

我不明白为什么最初的开发人员决定在这个设计中使用一个接口,因为这个接口实际上从未在任何地方实现过。有人有什么意见吗


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

,我将考虑使用常量为常数<强>不<强>类型安全(例如,它们只是int或字符串等)。p> 我建议您使用属性文件来存储所有常量。这样,您可以按照问题中的建议将属性加载到HashMap中


请注意,属性支持是java自带的:

我认为这是使用枚举的一个很好的选择。然后获取myenum.values(),然后对值应用for each循环。

嗯,这看起来像常量接口反模式,可能不应该使用。使用枚举可能是一种建议的方法,或者至少使用带有私有构造函数的最终类

如果您想根据输入字符串对 DoMeTestuff有不同的实现,您也可以考虑使用策略模式,即具有<代码> MAP>代码>,然后查找<>代码>查看 >的策略。如果找到了该策略,请执行其

doSomeStuff
,否则将处理“未找到”的情况。

这(具有存储常量的专用接口)是枚举时代之前存储常量的一种相当常见的方法。(Java之前的5次)它省去了在常量前面加上包含类名的麻烦。我个人从未真正喜欢过这种做法,但这就是人们这样做的原因

至于可以用什么来代替:

  • 枚举和开关/案例构造。这只需要最少的修改,但在可读性方面的好处不大。它确实为您提供了类型和值安全性,此外,如果您忘记处理可能的值,您还可以从IDE中获得警告(它没有
    case
    ,也没有
    default
    块)
  • 属性文件。这显然只在您不想基于常量值进行分支的情况下起作用。(即,如果您的常量不必出现在源代码中)这一点很重要,否则您将得到一组次要的常量和一个属性文件,这是非常糟糕的
  • A
    doSomeStuff()
    工厂。为此,您必须将
    doSomeStuff()
    实现包装在单独的操作类中,并且您可以静态地或从属性文件配置工厂。(通过常量值->操作类映射)。这是最具“进取心”的解决方案,这意味着尽管它看起来很漂亮,而且非常灵活,但在很多情况下,这是一种过火的解决方案

  • 嗯,枚举是一种方法。。。但是,如果“dosomestuff”在语义上依赖于特定的值,那么为什么不向枚举本身添加一个“dosomestuff”方法呢。这就是Java枚举的一个优点——它们不仅仅是数据,而且作为所有好的对象,它们都具有语义。然后,您只需在调用dosomestuff(whatiamlooking for)的枚举上循环,然后发生任何事情。

    很难说。 是的,我同意,它会更优雅——至少对你来说是这样。但是想想,下一个程序员会怎么想。这将更加复杂。
    前面提到的策略模式和java的enum肯定是更好的解决方案,但由于您正在维护这段代码,我不确定您的老板是否会对耗时的重构感到满意。我的建议是使用enum,而不是太大的代码更改

    不管怎样,我还是要联系原始开发者,问他们为什么?我承认一个巨大的if/then是原始的,但我感觉要么是最初的开发人员自己尝试过,遇到了麻烦,要么就是他们不知道更好的方法。。。简而言之,试一下iterable类,看看它是否工作(更好)。不幸的是,我没有能力联系原始开发人员。我将尝试一下枚举模型。因为接口没有在代码中的任何地方实现,我看不到任何直接的问题…我投票结束这个问题,因为我喜欢属性文件的想法,但我们的包已经使用了很多。我想我想探索一种基于类的解决方案,这很有意义。该软件包在1.5版本可用之前已编码。我想我会使用枚举方法。在这种情况下,工厂可能有点过火,但将来可能值得考虑,而属性文件解决方案正是您所说的问题。非常感谢。