Java 减少开关的案例数量

Java 减少开关的案例数量,java,spring,Java,Spring,我有下面的代码。它是一种工厂函数,根据编写器的类型检索编写器的实例。请注意,该类型是一个enum public Writer getWriter(WriterTypeEnum type){ switch(type){ case A: new AWriter() break; case B: ... break; case C: ... break; ... } } 问题是我有大约30个cases。我能做些什么来减少它们或根本不实施它们 过去我使用策略模式

我有下面的代码。它是一种工厂函数,根据编写器的类型检索编写器的实例。请注意,该类型是一个
enum

public Writer getWriter(WriterTypeEnum type){
  switch(type){
    case A: new AWriter() break;
    case B: ... break;
    case C: ... break;
    ...
  }
}
问题是我有大约30个
case
s。我能做些什么来减少它们或根本不实施它们

过去我使用策略模式解决了类似的案例,但现在我面对的是整个应用程序中使用的旧
enum
。另一个问题是我无法将SpringBean注入这个枚举。开关案例中的一些实例是
bean
s


WriterTypeEnum
有一个来自UI的ID,我必须根据该ID确定正确的实例。

创建一个writer名称的查找映射,然后使用反射创建一个实例怎么样

String writerNameJustFound=mapOfWriters.get(类型)


对象实例=Class.forName(writerNameJustFound).newInstance()

您可以将枚举设置为具有抽象方法

public abstract Writer getWriter();
然后,所有实例都必须实现该方法,例如

public enum YourEnum{
    FIRST(){
        public Writer getWriter(){
            return null;
        }
    }, ... // other enums

    public abstract Writer getWriter();

}

或者您可以省略开关中的中断,如果有重复的语句

欢迎使用前面的所有解决方案,并且在我的情况下,很可能有一些解决方案会起作用


我的解决方案是创建另一个具有
集的对象。在这个对象中,我存储了
WriterEnumType
的值及其对应的
Writer
我遇到的另一种回答是使用继承,即将WriterTypeEnum转换为WriterType

public Writer getWriter(WriterType type){
    return type.getWriter();
}
这样,您所要做的就是传递WriterType的正确子级,并且您永远不会接触getWriter中的代码。
问题在于上下文,即这种解决方案是否可能实施。

不清楚您在这里要求什么。您不必在switch语句中实现所有可能的情况。。。只需使用
default
来处理您不想显式处理的任何内容。另一种选择是使枚举本身能够创建一个编写器,但在不了解更多信息的情况下,我们无法真正确定。您可以使用Map并通过传递类型来获取对象。选中此项可能会对您有所帮助:--我已经在一些spring服务中实现了这些方法。对于那些没有被spring实例化的人,您的方法将起作用。在我的例子中,我有两种类型的实现,您不能将Springbean注入枚举。@tzortzik嗯,您不能自动连线,但我认为您可以获取应用程序上下文并按类型查找bean?或者你也可以听从他们的建议:stackoverflow.com/a/2119815/5070158;并且注入到内部类中。若模型是贫血的,那个么就不可能实现(或者很难实现)