我有两个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语句吗?
注意:这不是“我该怎么做?”问题,但“我该如何做这个更好问题”。
答案 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,...))。