我有以下代码。它是一种工厂函数,它根据它的类型检索作者的实例。请注意,类型为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,我必须确定正确的实例。
答案 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
的值。