Java 如何避免冗长的switch/case语句?
我有一个通用映射器类,它有一个确定应该使用哪个transformer实现的方法。此项的指示符是枚举。该方法如下所示:Java 如何避免冗长的switch/case语句?,java,optimization,Java,Optimization,我有一个通用映射器类,它有一个确定应该使用哪个transformer实现的方法。此项的指示符是枚举。该方法如下所示: private void test() throws Exception { MyEnum nameEnum = ... ITransformer myTransformer; switch (nameEnum) { case ENUM1: mytransformer= new TransformerImpl1(this);
private void test() throws Exception {
MyEnum nameEnum = ...
ITransformer myTransformer;
switch (nameEnum) {
case ENUM1:
mytransformer= new TransformerImpl1(this);
mytransformer.doUnmarshal();
break;
case ENUM2:
mytransformer= new TransformerImpl2(this);
mytransformer.doUnmarshal();
break;
case ENUM3:
mytransformer= new TransformerImpl3(this);
mytransformer.doUnmarshal();
break;
...// 40 x
}
}
我知道如何填充静态映射以避免此类switch/case语句,但这里我必须返回一个类的实例,所以我认为这不起作用
我想我也不能将选择哪个转换器的信息提供给枚举本身,因为我必须将MapperClass作为参数提供给转换器实现
但我认为必须有一个解决方案来避免这样长的switch/case语句,即使在我的例子中,类具有“不太好”的耦合
public enum MyEnum {
ENUM1(new TransformerImpl1()),
ENUM2(new TransformerImpl2()),
ENUM3(new TransformerImpl3()),
ENUM4(new TransformerImpl4());
ITransformer myTransformer;
MyEnum(ITransformer myTransformer){
this.myTransformer=myTransformer;
}
public ITransformer getTransformer() {
return this.myTransformer;
}
}
然后获取enum实例的转换器并执行取消映射您可以得到如下结果:
public enum MyEnum {
ENUM1(new TransformerImpl1()),
ENUM2(new TransformerImpl2()),
ENUM3(new TransformerImpl3()),
ENUM4(new TransformerImpl4());
ITransformer myTransformer;
MyEnum(ITransformer myTransformer){
this.myTransformer=myTransformer;
}
public ITransformer getTransformer() {
return this.myTransformer;
}
}
然后获取enum实例的transformer并执行取消映射如果您的transformer具有相同的契约(相同的方法),则可以实现工厂方法模式。此模式提供了更大的灵活性,可以添加更多功能性如果您的变压器具有相同的合同(相同的方法),则可以实现工厂方法模式。此模式提供了更大的灵活性,可以添加更多的功能性您可以拥有enum和transformerimpl的映射。所以,根据枚举从映射中获取适当的transformerimpl,然后进行解组。没有任何情况下,如果需要的话,您没有弄清楚这段代码的问题是什么。您的示例代码有点奇怪,它是一个没有参数的void方法。您的用例是什么?@Sikorski:是的,我知道映射的事情,但是当值应该是类的实例时,如何用键/值对填充映射?向枚举添加一个抽象方法来进行转换,并为每个枚举值实现它。这样做的好处是,如果您将其作为一个新值,您就不会忘记实现它。@Arbi的回答几乎涵盖了这一点。您可以拥有enum和transformerimpl的映射。所以,根据枚举从映射中获取适当的transformerimpl,然后进行解组。没有任何情况下,如果需要的话,您没有弄清楚这段代码的问题是什么。您的示例代码有点奇怪,它是一个没有参数的void方法。您的用例是什么?@Sikorski:是的,我知道映射的事情,但是当值应该是类的实例时,如何用键/值对填充映射?向枚举添加一个抽象方法来进行转换,并为每个枚举值实现它。这样做的好处是,如果将它作为一个新值,您就不会忘记实现它。@Arbi的回答几乎涵盖了它。然后,当我必须确定需要哪个变压器时,我有相同的开关/案例或if/else星座。请参阅链接的getShape()方法。Factory还需要根据传递的枚举参数决定应返回哪个TransformerImp实例,因此您只是将OP问题移动到不同的类。抱歉,链接错误。因此,您可以使用Arbi的方法。但是,如果您想拥有单独的transformer实例,您可以使用一个映射,将枚举作为键,将transformer类作为值,如下所示。
map则当我必须确定需要哪个transformer时,我有相同的开关/案例或if/else星座。请参阅链接的getShape()方法。Factory还需要根据传递的枚举参数决定应返回哪个TransformerImp实例,因此您只是将OP问题移动到不同的类。抱歉,链接错误。因此,您可以使用Arbi的方法。但是,如果您想拥有单独的transformer实例,您可以使用映射,将枚举作为键,将transformer类作为值,如下所示。map这是一种在枚举本身中具有行为的干净方法。但是TransformerImpl接受使用它的类的参数。OP可能需要提供更多的上下文。除此之外,这是正确的解决方案。有效Java手册中提到了这种方法。@Amudhan您可以将一个转换器生成器传递给枚举构造函数,然后我们得到它,您放入所需的上下文并构建转换器。这是一种在枚举本身中具有该行为的干净方法。但是TransformerImpl接受使用它的类的参数。OP可能需要提供更多的上下文。除此之外,这是正确的解决方案。有效的Java书籍中提到了这种方法。@Amudhan您可以将一个转换器生成器传递给枚举构造函数,然后我们得到它,您放入所需的上下文并构建转换器。