(我搜索了"其他如果范围"但没有提出任何回答我的问题的帖子).
当使用if .. elseif .. else根据某些(互斥)范围内的变量选择要做什么时,我喜欢明确指定范围:
int num = 55;
String message;
if (num >= 20) {
// update message variable
message = "Bigger or equal to than 20";
}
else if (10 <= num && num < 20) {
// update message variable
}
else if (0 <= num && num < 10) {
// update message variable
}
else if (num < 0) {
// update message variable
}
System.out.println(message);
Run Code Online (Sandbox Code Playgroud)
但是我看到的所有教科书和讲义都写了这样一个例子:
int num = 55;
String message;
if (num >= 20) {
// update message variable
message = "Bigger or equal to than 20";
}
else if (num >= 10) {
// update message variable
}
else if (num >= 0) {
// update message variable
}
else {
// update message variable
}
System.out.println(message);
Run Code Online (Sandbox Code Playgroud)
我明白为什么他们确保最后使用else(即阻止Java编译器认为像消息这样的变量可能没有被初始化,如果该变量是原始的),但考虑到所有教科书和讲义都显示了其他风格,是否有明确写出所有其他条件范围所引起的问题,我喜欢这样做?
不要重复自己.
使用您的方法,您将不必要地在代码中重复两次相同的值.这有几个缺点,包括:
else if,你已经知道先前的条件是错误的.以后的维护可能会改变其中一个值,但不会改变另一个值,从而导致一些令人惊讶的行为.
if ( num >= 30 ) {
// update message variable
}
else if (10 <= num && num < 20 ) { // Whoops!
// update message variable
}
...
Run Code Online (Sandbox Code Playgroud)
您可以通过为每个值定义常量来避免这种情况.但是,您的代码仍在指定冗余检查.
final int HIGH = 20;
final int MEDIUM = 10;
final int LOW = 0;
if (num >= HIGH ) {
// update message variable
}
else if (MEDIUM <= num && num < HIGH ) { // We already know num<HIGH
// update message variable
}
...
Run Code Online (Sandbox Code Playgroud)
如果我正在构建一些可以在某种飞行器上运行并成功降落在另一个星球上的代码,那么我总是会说得很清楚。请记住,一行代码将被写入一次,但可以被读取数百次。在凌晨 4 点的调试会话中,您的第一个代码片段将更容易理解。
您的第一种方法确实更清晰,如果错误的重构者重新排序条件检查,则不会引入错误。
} else {如果程序控制不应该达到这一点,我总是以“虽然”结束,理想情况下以某种断言结束。