Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免冗长的switch/case语句?_Java_Optimization - Fatal编程技术网

Java 如何避免冗长的switch/case语句?

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);

我有一个通用映射器类,它有一个确定应该使用哪个transformer实现的方法。此项的指示符是枚举。该方法如下所示:

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您可以将一个转换器生成器传递给枚举构造函数,然后我们得到它,您放入所需的上下文并构建转换器。