假设我有如下代码:
int age=(from user input);
int weight=(from user input);
if(age>60){
if(weight>100){
function1();
}else if(weight<40){
function2();
}else{
function3();
}
}else if(age<20){
if(weight>100){
function4();
}else if(weight<40){
function5();
}else{
function6();
}
}else{
if(weight>100){
function7();
}else if(weight<40){
function8();
}else{
function9();
}
}
问题是代码模式:
if(weight>100){
//do something different
}else if(weight<40){
//do something different
}else{
//do something different
}
重复,因为年龄范围不同。而且我不能将内部if-else包含在一个函数中,因为即使条件相同,要做的事情也有所不同。有什么方法可以修改此代码,以使代码模式:
if(age>60){
//do something different
}else if(age<20){
//do something different
}else{
//do something different
}
和
if(weight>100){
//do something different
}else if(weight<40){
//do something different
}else{
//do something different
}
只会出现一次?
最佳答案
如果没有看到您的function1-9的全部功能(可能对于Stack Overflow来说可能是太多的代码),很难给出确切的答案。如果function1
时function2
,function3
和age > 60
都执行某些常规操作,而function1
时function4
,function7
和weight > 100
都执行某些常规操作,则您可能能够将这些功能分开,然后将公共部分放回新的方法中。
如果您确实有9个不同的功能,它们没有共同点,那么就没有真正好的解决方案。您可以尝试设置将所有9个组合映射到函数的映射:
Map<String, Runnable> functions = new HashMap<>();
functions.put("senior_heavy") = this::function1;
functions.put("senior_medium") = this::function2;
functions.put("senior_light") = this::function3;
functions.put("middleaged_heavy") = this::function4;
...
functions.put("child_light") = this::function9;
[您必须考虑更好的名字,因为20岁的年龄并不完全是中年。]
然后:
String ageString;
// set this to "senior", "middleaged", or "child"
String weightString;
// set this to "heavy", "medium", or "light"
functions.get(ageString + "_" + weightString).run();
Runnable
是不带参数且不返回结果的方法的接口。 (对于带有参数和/或返回结果的函数,您还可以使用其他功能接口类型。或者您可以像smac89的答案中那样定义自己的函数接口类型,从而为功能接口类型提供一个更具描述性的名称。 )this::function1
是对属于当前对象function1
的this
的引用;但是,如果function1
是static
,则需要说ThisClass::function1
。这样可以消除重复的
if
模式,但这不是一个很好的解决方案。如果我正在查看您的代码,那么我不会抱怨您的原始代码,因为替代方法也不太好。 (Runnable
的二维数组是另一种选择。)关于java - 如何在另一个if-else中消除条件相同但 Action 不同的if-else?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47667534/