(我搜索"否则,如果范围"但没有提出任何回答我问题的帖子。)
当使用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);
但我看到的所有教科书和讲义都写了这样一个例子:
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);
我明白为什么他们确保最后使用else(即阻止Java编译器认为像消息一样的变量可能没有被初始化,如果该变量是原始的),但考虑到所有的教科书和讲义显示其他风格,是否有任何问题是由我明确写出所有其他条件的范围,我喜欢这样做?
答案 0 :(得分:7)
不要重复自己。
使用您的方法,您将不必要地在代码中重复两次相同的值。这有几个缺点,包括:
else if
,您已经知道先前的条件是错误的。以后的维护可能会改变其中一个值,但不会改变另一个值,从而导致一些令人惊讶的行为。
if ( num >= 30 ) {
// update message variable
}
else if (10 <= num && num < 20 ) { // Whoops!
// update message variable
}
...
您可以通过为每个值定义一个常量来避免这种情况。但是,您的代码仍在指定冗余检查。
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
}
...
答案 1 :(得分:2)
如果我构建一些可以在某种车辆上运行的代码成功登陆另一个星球,那么我总是会为清晰度而烦恼。请记住,一行代码将一次写入,但可以读取数百次。在凌晨4点的调试会话中,您的第一个代码段将更容易理解。
如果错误的重构器重新排序条件检查,那么第一种方式确实更清楚,并且不会引入错误。
我总是以} else {
完成,理想情况下,如果程序控制不应达到,那么理想情况下会有某种断言。