几周前,我提交了一个代码审查功能,看起来像这样。
Function{
If (condition)
Else If (condition)
Else if (condition)
Else
return value
}
我的主要代码审查说“我讨厌别人”,但他没有说明为什么或我应该做什么。他只是让我继续上传这个功能。
我的问题是,什么是一些“其他ifs”的替代品会使代码看起来更优雅,也许表现更好?
我试着提起他的代码来了解他会做什么,我多次注意到他做了
If (condition)
If (condition)
If (condition)
我应该避免写“别人”吗?我打算问他,但他不再在这里工作了。
谢谢
答案 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
其中表达式是任何评估为boolean
或Boolean
的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
陈述的唯一时间是条件和相关行为真正独立于彼此。