减少交换机的病例数

时间:2016-07-28 10:44:07

标签: java spring

我有以下代码。它是一种工厂函数,它根据它的类型检索作者的实例。请注意,类型为enum

public Writer getWriter(WriterTypeEnum type){
  switch(type){
    case A: new AWriter() break;
    case B: ... break;
    case C: ... break;
    ...
  }
}

问题是我有大约30 case秒。我该怎么做才能减少它们或者根本不执行它们?

我过去使用策略模式解决了这样的情况,但在这里我面对的是整个应用中使用的旧enum。另一个问题是我无法将弹簧豆注入此枚举。来自切换案例的一些实例是bean s。

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

4 个答案:

答案 0 :(得分:4)

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

public abstract Writer getWriter();

之后,您的所有实例都必须实现该方法,例如

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

    public abstract Writer getWriter();

}

或者如果有重复的陈述,你可以省略你的开关中断

答案 1 :(得分:2)

如何查找编写器名称的地图,然后使用反射创建实例?

String writerNameJustFound = mapOfWriters.get(type);

Object instance = Class.forName(writerNameJustFound).newInstance();

答案 2 :(得分:1)

我遇到的另一种答案是使用继承,即将WriterTypeEnum转换为WriterType。

public Writer getWriter(WriterType type){
    return type.getWriter();
}

这样,您所要做的就是传递WriterType的正确子项,并且您永远不会触及getWriter中的代码。 问题在于背景,这种解决方案是否可以实施。

答案 3 :(得分:0)

欢迎所有以前的解决方案,并且很可能一些解决方案适用于我的情况。

我的解决方案是创建另一个具有Set<WriterMapping>的对象。在此对象中,我存储了WriterEnumType及其通讯员Writer的值。