假设我有如下代码:

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来说可能是太多的代码),很难给出确切的答案。如果function1function2function3age > 60都执行某些常规操作,而function1function4function7weight > 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是对属于当前对象function1this的引用;但是,如果function1static,则需要说ThisClass::function1

这样可以消除重复的if模式,但这不是一个很好的解决方案。如果我正在查看您的代码,那么我不会抱怨您的原始代码,因为替代方法也不太好。 (Runnable的二维数组是另一种选择。)

关于java - 如何在另一个if-else中消除条件相同但 Action 不同的if-else?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47667534/

10-10 21:53