分支效率

时间:2016-02-05 17:13:56

标签: java

几周前,我提交了一个代码审查功能,看起来像这样。

Function{
If (condition)
Else If (condition)
Else if (condition)
Else
return value
}

我的主要代码审查说“我讨厌别人”,但他没有说明为什么或我应该做什么。他只是让我继续上传这个功能。

我的问题是,什么是一些“其他ifs”的替代品会使代码看起来更优雅,也许表现更好?

我试着提起他的代码来了解他会做什么,我多次注意到他做了

If (condition)
If (condition)
If (condition)

我应该避免写“别人”吗?我打算问他,但他不再在这里工作了。

谢谢

5 个答案:

答案 0 :(得分:1)

您可以使用开关。

switch (variable) {
  case 1:
  doSomething();
  break;
  case 2:
  doSomething();
  break;
  case 3:
  doSomething();
  break;
  default:
  doSomething();
  break;
}

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

答案 1 :(得分:1)

哎呀,我误解了你的问题,所以你可能已经知道了,但无论如何:

这是它的工作原理:

示例1 如果你的程序是这样的:

if(condition1){ doThing1(); }
else if(condition2){ doThing2(); }
else if(condition3){ doThing3(); }
else{ doThing4() }
done();

您的程序首先要检查condition1是否为真。如果是,它将运行方法doThing1()。之后它不会检查condition2或condition3,而是直接进入done()方法。

如果condition1为false,程序将检查condition2是否为真。如果是,它将运行方法doThing2(),然后它将直接进入done() - 方法。

如果condition1和condition2为false,程序将检查condition3是否为true,如果是,则运行doThing3() - 方法。

如果没有条件为真,它将运行方法doThing4(),然后运行done方法。

示例2: 但是,如果您的程序如下所示:

if(condition1){ doThing1(); }
if(condition2){ doThing2(); }
if(condition3){ doThing3(); }
done();

您的程序首先检查condition1是否为true,如果是,则运行方法doThing1()

然后检查condition2是否为true,如果是,则运行doThing2() - 方法

然后检查condition3是否为true,如果是,则运行doThing3() - 方法

最后,它运行done() - 方法。

不同之处在于,在示例1中,如果condition1为true,则程序不检查condition2或condition3,而在示例2中,它始终检查所有条件。这意味着在示例1中,将仅运行其中一个方法doThing1(),doThing2(),doThing3()和doThing4()。但是,在示例2中,如果多个条件为真,则程序将运行多个方法。

尝试编写一个简单的程序,使用这两个例子并更改doThing1();到System.out.println(“1”);依此类推,如果您不理解我的答案,请尝试不同的值组合(真或假)。

答案 2 :(得分:1)

我尽量避免使用“else”,“else if”以及“if”和“for”。在我看来,分支和循环增加了代码的复杂性。但它每次都取决于你想做什么。一些例子:

如果您这样做:

A

而不是这个,你可以使用继承:

if fruit.isBanana() then fruit.eatBanana()
else if fruit.isOrange() then fruit.eatOrange()
...

然后,如果你有一个实例:

class Banana extends Fruit {
    function eat() {
        ... yum yum yum banana ...
    }
}
class Orange extends Fruit {
    function eat() {
        ... yum yum yum orange ...
    }
}

另一个例子:如果您使用“if”和“for”进行过滤:

fruit.eat()

然后您可以使用collections代替:

longFruits = []
for fruit in fruits {
    if fruit.isBanana() then longFruits.add(fruit)
}

这只是一些例子和技术。

答案 3 :(得分:1)

我会使用间距来确保代码看起来整洁而不会改变代码的实际含义。你可以使用switch,如shinjw:s中所述,但这并不总是实用的,因为你必须使用byte,short,char或int来确定结果。只需写下

     if(condition1) //place1
else if(condition2) //place2
else if(condition3) //place3
else                //place4

如果你想要的话,确保条件很好地排成一行,但只有当你要在1,2,3和4号位写的东西是一行时才使用它。否则看起来很奇怪。如果排队条件并不重要,我会写

if(condition1)      //code1
else if(condition2) //code2
else if(condition3) //code3
else                //code4

由于Java不是空间敏感的,任何可以使用一个空格的地方都可以使用任意数量的空格,并且只要你可以使用一个新行,就可以使用任意数量的空行。它不是标签,而是分隔代码的{}。

答案 4 :(得分:1)

在前面:我喜欢else if。我认为它可以提供良好的清洁代码,除非可以设计出一系列比较的必要性。那说,......

else if不是Java中的第一类构造。实际上if嵌套在else内。从JLS 7开始(因为OP表示他们使用的是Java 6而我没有使用JLS),IfThenElseStatement

if ( Expression ) StatementNoShortIf else Statement

其中表达式是任何评估为booleanBoolean的Java表达式,而 StatementNoShortIf 是任何未结束的Java语句没有if的{​​{1}}。

我们通过将另一个else语句替换为语句(在else if之后)获得if。所以

else
就Java而言,

与:

相同
// example 1
if (condition0) {
    // body 0
} else if (condition1) {
    // body 1
} else if (condition2) {
    // body 2
} else {
    // body 3
}

语法上的唯一区别在于,在示例2中没有省略任何大括号(或者换句话说,嵌套的// example 2 if (condition0) { // body 0 } else { if (condition1) { // body 1 } else { if (condition2) { // body 2 } else { // body 3 } } } 语句已被包含在块中)。 if构造是可能的,因为那些封闭的块是不必要的。

你以前的领导者可能会在可以使用的地方使用大括号,认为这在某种程度上更安全​​或更具可读性。我不同意这个想法:正如我所说,else if使代码更清晰IMO。但是,除了else if之外,任何意义上的一系列断开if陈述的唯一时间是条件和相关行为真正独立于彼此。