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;并且注入到内部类中。若模型是贫血的,那个么就不可能实现(或者很难实现)