如果条件嵌套

时间:2013-03-16 09:35:08

标签: java nested-if

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

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

请帮助解决Java Java Version 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运算是一个很大的。

7 个答案:

答案 0 :(得分: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();  

答案 1 :(得分:1)

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

请注意,只有在String语句中使用switch时才能使用JDK 7。旧版enum可能会有所帮助。

答案 2 :(得分: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 enum,则操作IllegalArgumentException

答案 3 :(得分:1)

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

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

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");
    }
}

答案 4 :(得分: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


您也可以尝试使用Strategy pattern

答案 5 :(得分:1)

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

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之类的内容。

注意:如果你正在制作一个计算器(是吗?),也许Reverse Polish notation会更好。

答案 6 :(得分:0)

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

检查字符串条件的数量

您可以使用switch

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

附注:打开Java7提供的字符串。