-1

我在我们的核心 java 应用程序中面临嵌套 if 条件的巨大问题 代码摘要如下......我们可以有近 20 个嵌套 if 条件你能告诉我如何优化这段代码吗?

有什么更好的方法可以避免 java.i 中的这种嵌套 if 条件可以有 20 个嵌套 if 条件,从 Java 应用程序的设计角度来看,这可能是一个巨大的问题。

请帮助解决 java Java 版本 1.6

String condition = getCondition();
if (condition.equals(add)) { // add operation
    add();
    if (condition.equals(sub)) {// sub operation
        sub();
        if (condition.equals(div)) { //div operation
            div();
            if (condition.equals(cos)) { // cos operation
                cos();
            }
        }
    }
}

编辑:我可以有更多的数学运算,比如 20 多个,然后切换工作。20 个运算非常多。

4

7 回答 7

2

您应该像这样使用 if else-if 条件:

String condition = getCondition();      
if(condition.equals(add))
    add();   
else if(condition.equals(sub)) 
    sub();   
else if(condition.equals(div))   
    div();   
else if(condition.equals(cos))   
    cos();  
于 2013-03-16T09:39:28.180 回答
1

改为使用switch语句。当你有很多决定时使用它。

请注意,只有当您想要使用Stringinswitch语句时,JDK 7 才会发生这种情况。在旧版本enum中可能会有所帮助。

于 2013-03-16T09:36:40.120 回答
1

状态模式:

public enum Operation {
ADD {
    int execute(int a, int b) {
        return a + b;
    }
},
SUB {
    int execute(int a, int b) {
        return a - b;
    }
},
MUL {
    @Override
    int execute(int a, int b) {
        return a * b;
    }
},
DIV {
    @Override
    int execute(int a, int b) {
        return a / b;
    }
};

abstract int execute(int a, int b);

public static void main(String[] args) {
    Operation oper = getOperation();
    oper.execute(3, 4);
}

private static Operation getOperation() {
    return Operation.MUL;
}

}

像这样:

public static void main(String[] args) {
    String operation = user set it
    Operation oper = getOperation(operation);
    oper.execute(3, 4);
}

private static Operation getOperation(String operation) {
    return Operation.valueOf(operation.toUpperCase());
}

请注意,如果 operation 为 null,则 Operation.valueOf 可能会抛出 NullPointerException;如果 operation 不是 Operation 枚举之一,则可能会抛出 IllegalArgumentException

于 2013-03-16T09:44:31.053 回答
1

如果 if 语句不需要嵌套,那么您可以使用命令模式。

首先,设置匹配器和命令之间的映射。这些命令遵循通用调用接口,例如 Runnable、Callable 或在我的示例命令中。该示例展示了如何动态创建包装器并使用静态或非静态类。如果事先不知道实际命令,这种模式是实用的,因为以后可以添加和删除命令。

public class CommandExample {

    private interface Command {
        public void execute();
    }

    private Map<String, Command> commands = new HashMap<>();

    private void setUp() {
        commands.put("add", new Command() {
            public void execute() {
                add();
            }
        });
        commands.put("sub", new Sub());
        commands.put("arg", new Argument("the argument"));
    }

    private void add() {
        System.out.println("Add called");
    }

    private static class Sub implements Command {
        @Override
        public void execute() {
            System.out.println("Sub called");
        }
    }

    private class Argument implements Command {

        private final String arg;

        public Argument(String arg) {
            this.arg = arg;
        }

        @Override
        public void execute() {
            System.out.println("Argument called with arg " + arg
                    + " and access to outer class " + CommandExample.this);
        }
    }

    private void execute(String... names) {
        for (String name : names) {
            Command command = commands.get(name);
            if (command != null) {
                command.execute();
            } else {
                System.err.println("Command '" + name
                        + "' is not known. Only know " + commands.keySet());
            }
        }
    }

    public static void main(String[] args) {
        CommandExample commandExample = new CommandExample();
        commandExample.setUp();
        commandExample.execute("add", "sub", "arg", "unknown");
    }
}
于 2013-03-16T09:50:08.660 回答
1

在这里,您有如何使用枚举的示例。首先创建你的枚举

enum MathOperations{
    ADD, SUB, DIV, COS;
}

然后你可以像这样使用它

MathOperations m = MathOperations.valueOf(getCondition().toUpperCase);
switch(m) {
    case ADD: add(); break;
    case SUB: sub(); break;
    //and so on...
}

当然,它只有在getCondition()返回元素时才有效MathOperations。否则你会得到IllegalArgumentException.


您也可以尝试使用策略模式

于 2013-03-16T09:55:44.493 回答
1

您可以将add, sub, div, cos... 放入有序列表/数组中。然后使用for循环来迭代列表。使用break运算符和反射调用适当的方法。

final String[] OPERATION_LIST = { "add", "sub", "div", "cos" };
String condition = getCondition();
for (String op : OPERATION_LIST) {
    if (condition.equals(op))
        getClass().getMethod(op).invoke(this);
    else
        break;
}

上面的for循环等于您的嵌套if语句。缺点是必须有其他数学方法public。如果没有,您需要类似Accessing Private Methods 之类的东西。

注意:如果您正在制作计算器(是吗?),也许反向波兰表示法更好。

于 2013-03-16T10:10:56.080 回答
0

根据您的代码,它应该始终满足condition.equals(add)执行下一行。根据网络行中的条件,它永远不会满足下一个条件。它何时进入下一行代码?

检查字符串条件的数量

您可以使用switch.

 String condition = getCondition();    
  switch(condition ) {
        case add:
            add();
            break;
        case sub:
            sub();
            break;
        // etc...
    }

旁注:打开可用的字符串Java7

于 2013-03-16T09:39:15.403 回答