For循环在Switch-Case - Java中



我想确定area1, area2等的一些端口书写

void controlEvent(CallbackEvent event) {
if (event.getAction() == ControlP5.ACTION_CLICK) {
for (int i=1; i<13; i++){
switch(event.getController().getName()) {  
case "Area" + str(i):
println("Button" + i + " Pressed");
if (port != null) port.write(i + "n");
break;}
}
}
}

但是我得到&;大小写表达式必须是常量表达式&;错误。有没有一种方法来使用for循环在切换情况?如果不是,重写上面代码的最合乎逻辑的方法是什么?

问题列表:

case "Area" + str(i):

如前所述,switch只需要常量,因此该值必须在编译时已知,而不是动态的。所以

case "Area1":
case "Area2":
... etc

如果你想更动态,那么使用If和else-if语句;

void controlEvent(CallbackEvent event) {
if (event.getAction() == ControlP5.ACTION_CLICK) {
for (int i=1; i<13; i++){ 
final String controlName = event.getController().getName();
if(controlName.equals("Area" + str(i))){
println("Button" + i + " Pressed");
if (port != null) {
port.write(i + "n");
}
break;
} 
...
}}}

规范化操作名称并提取代码块是一个好主意。有13个if-else语句的切换案例可能很难阅读,所以最好提取方法来处理每个ControlP5conrtolName

第二种方法(可能有点太复杂,但仍然):创建动作映射:

Map<String, Consumer<Integer>> actionMap = new HashMap<>();
actionMap.put("Area1", i ->{
println("Button" + i + " Pressed");
if (port != null) {
port.write(i + "n");
}
});
actionMap.put("Area2", i ->{
println("Button" + i + " Pressed");
...
});
.. etc

现在你可以检查你的动作地图是否包含所需的controlName:

void controlEvent(CallbackEvent event) {
if (event.getAction() == ControlP5.ACTION_CLICK) {
final String controlName = event.getController().getName();
if(actionMap.hasKey(controlName)){
actionMap.get(controlName).apply(...)
break;
}
}
}
}

最新更新