如何避免长 switch/case 语句?
How can I avoid long switch/case statement?
我有一个通用映射器 class,它具有确定应使用哪个转换器实现的方法。这个指标是一个枚举。该方法如下所示:
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 语句,但在这里我必须 return 一个 class 的实例,所以我认为这行不通.
我想我也不能将选择哪个转换器的信息提供给枚举本身,因为我必须将 MapperClass 作为参数提供给转换器实现。
但我认为必须有一个解决方案来避免这么长的 switch/case 语句,即使在我的情况下 classes 有一个 "not so good" 耦合。
你可以有这样的东西:
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;
}
}
然后获取枚举实例的transformer并进行unmarchalling
如果你的转换器有相同的契约(相同的方法),你可以实现工厂方法模式Check this link。这种模式提供了更多的灵活性来添加更多的功能
我有一个通用映射器 class,它具有确定应使用哪个转换器实现的方法。这个指标是一个枚举。该方法如下所示:
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 语句,但在这里我必须 return 一个 class 的实例,所以我认为这行不通.
我想我也不能将选择哪个转换器的信息提供给枚举本身,因为我必须将 MapperClass 作为参数提供给转换器实现。
但我认为必须有一个解决方案来避免这么长的 switch/case 语句,即使在我的情况下 classes 有一个 "not so good" 耦合。
你可以有这样的东西:
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;
}
}
然后获取枚举实例的transformer并进行unmarchalling
如果你的转换器有相同的契约(相同的方法),你可以实现工厂方法模式Check this link。这种模式提供了更多的灵活性来添加更多的功能