具有相同控制表达式但案例实现不同的switch语句

时间:2018-07-13 09:22:37

标签: java switch-statement

我有两个switch语句,它们的结构相同,但情况却有所不同。如何合并它们?还是有更好的设计建议而不是使用两个switch语句?

这是第一个switch语句的外观:

switch(var){
   case 1:
    functionA();
   break;
   case 2:
    functionB();
   break;
}

第二个看起来像这样:

switch(var){
   case 1:
    functionC();
   break;
   case 2:
    functionD();
   break;
}

问题是,functionA()不能与functionC()同时被调用,functionB()functionD()也是如此-它们将在不同的时间被调用。 / p>

如果这听起来很愚蠢,请原谅我,但是有一种方法可以在不同情况下重新使用一个switch语句吗?

注意:这不是“我该怎么做?”问题,但“我该如何做这个更好问题”。

1 个答案:

答案 0 :(得分:0)

我选择不必进一步简化您的switch语句,因为它们易于读取并且可以执行不同的操作。此外,为了简化操作,您需要添加一个附加的抽象层,这在这里(实际上)是不可能的。

您唯一可以在这里抽象的是var参数。尽管我不推荐这样做,也许您可​​以尝试以下方法:

private Consumer<Integer> createConsumer(Runnable... actions) {
    return i -> {
        if (actions.length < i)
            throw new IllegalArgumentException();
        actions[i].run();
    };
}

您可以创建一个消费者,该消费者接受任意数量的Runnable个对象

var consumer = createConsumer(
            () -> System.out.println("First"),
            () -> System.out.println("Second"),
            () -> System.out.println("Third"));

并像

一样执行
consumer.accept(0);

如果您还需要一个默认语句Consumer<Integer> createConsumer(Runnable... actions, Runnable defaultOption)来解救,那么IllegalArgumentException也将是多余的。

但是,这只是switch语句的某种功能样式,只要参数不是从0开始,而是其他一些数字(可能需要减去到0),这会使事情变得更加复杂。或者,如果您切换的块具有“空白”(在数字之间(0、1、3,...))。