12

我有这些长语句,我将在这里称为 x,y 等。我的条件语句的结构是这样的:

if(x || y || z || q){
    if(x)
       do someth
    else if (y)
       do something

    if(z)
       do something
    else if(q)
       do something
}
else
    do smthing

有没有更好、更短的方法来写这个东西?谢谢

4

6 回答 6

4

我认为你现在的写作方式没有什么大问题。我建议即使对于单语句 if 块也使用花括号。这将帮助您避免错误,以防您以后必须添加更多代码行(然后可能会忘记添加花括号)。我也觉得它更具可读性。代码将如下所示:

if (x || y || z || q) {
    if (x) {
       do something
    } else if (y) {
       do something
    }

    if (z) {
       do something
    } else if (q) {
       do something
    }
} else {
    do something
}
于 2010-04-07T07:22:12.337 回答
4

避免多重检查和容易出错的复杂逻辑表达式的另一个变体可能是:

boolean conditionhandled = false;
if (x) {
   do something
   conditionhandled = true;
} else if (y) {
   do something
   conditionhandled = true;
}

if (z) {
   do something
   conditionhandled = true;
} else if (q) {
   do something
   conditionhandled = true;
}

if (!conditionhandled) {
   do something
}
于 2010-04-07T07:24:27.843 回答
1

这对我来说似乎很清楚(清晰很好)。

您可以做的是首先评估 x、y、z 和 q 并将它们存储为变量,这样您就不必这样做两次。

于 2010-04-07T07:17:59.323 回答
1

也许这更容易阅读。但现在您将执行一项额外检查。如果它不是关键任务代码,那么也许您可以使用以下代码:

if (x)
  do something;
else if (y)
  do something;

if (z)
  do something;
else if(q)
  do something;

if !(x || y || z || q)
  do something completely different.
于 2010-04-07T07:18:05.003 回答
0

我不推荐以下,事实上,我认为你得到的很好,但是:

s = true;
if (x) {
    do something;
    s = false;
} else if (y) {
    do something;
    s = false;
}
if (z) {
    do something;
    s = false;
} else if (q) {
    do something;
    s = false;
}

if (s) {
    so something;
}
于 2010-04-07T07:22:17.230 回答
0

你能对 x,y,z,q 做一些假设吗?eG 只有其中之一可能是真的。比你能把它看作一个国家

enum State {
X{
  void doSomething(){
    doItTheXWay();
  }  
},
Y{
  void doSomething(){
    doItTheYWay();
  }  
},
Z{
  void doSomething(){
    doItTheZWay();
  }  
},
Q{
  void doSomething(){
    doItTheQWay();
  }  
};
  void doSomething(){

  }
}

在您使用 if 语句的代码中

你可以分配一个状态,然后做正确的事

State state = getAState();
state.doSomething();

如果您不喜欢枚举,State 可能是一个接口,而 X 到 Q 可能是实现类。这种情况下的好处是多次使用相同的 if else 构造。稍后说一些代码行,您将从

if(x)
  do_the_next_thing_with_X();
...

或者您可以使用另一个函数扩展您的枚举并进行一次调用

state.doTheNextThing();
于 2012-08-11T23:23:20.613 回答