我在核心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运算是一个很大的。
答案 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)
您可以将add
,sub
,div
,cos
...放入有序列表/数组中。然后使用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
提供的字符串。