Java漫游笔记-02-05-流程控制

编程规范

建议在任何情况下(哪怕是只有一个语句)都使用大括号 {} 包裹控制语句块。

例如:

1
2
3
4
5
6
7
8
9
if( true ) {
// some code
} else {
// some code
}

while (true) {
// some code
}

原因是,结构更加清晰,后续也更易于维护代码(例如,需要添加代码,直接在 {} 中添加即可)。

条件语句

if-else

switch 一般只用于匹配某个值(可以是 charshortintenumString ( JDK 1.7 以后支持) ),而 if-else 还可以用于判断某个范围。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
int score = 88;
char grade;
if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
} else if (score >= 70) {
grade = 'C';
} else if (score >= 60) {
grade = 'D';
} else {
grade = 'F';
}

switch

可以使用 switch 的地方,都能用 if-else 替代。

switchcase 分支如果没有 break ,那么会继续执行下一个 case 分支。
这种情况,我称之为“直通车”,有时候有用,但总觉得太刺激了,尽量少用!
可以在编译的时候,使用 -Xlint:fallthrough 选型来检测。

虽然 default 分支在语法上可有可无,但是,强烈建议,在使用 switch 的时候都保留一个 default ,来处理所有 case 都不满足的情况。
并且,不管 default 放在什么位置,它总是最后一个被执行的。

循环语句

while

while 其实没什么好说的。
它的使用场景主要有:

  • 无限循环 while(true) ,比 for(;;) 更直观。
  • 使用迭代器 Iterator 的时候,个人感觉 while(iterator.hasNext())for (Iterator iterator = collection.iterator(); iterator.hasNext();) 也要直观一些。

do-while

当你至少需要循环一次,才能确定是否继续的时候,可以考虑使用 do-while

for

我觉得使用 for 比使用 whiledo-while 更优雅。
因为它把计数器的初始化,循环条件以及计数器的更新代码都集中在一起,更清晰,也更安全。
因此,对于循环语句,我倾向于使用 for

foreach

JDK 1.5 以后,提供了 foreach 的支持。这是一种特殊 for 语法。
foreach 相比传统的 for 而言,更简洁,不需要创建额外的变量,一般情况下优先使用它。
需要注意的是:

  • foreach 语句最终会被编译为: java.util.Iterator.hasNext()java.util.Iterator.next() 之类的语句。
  • 因此,foreach 遍历的顺序也是不可控的。

中断语句

goto

Java 虽然把 goto 定义为保留关键字,但是没有实际使用它。
使用 break 可以实现 goto 类似的功能(只能跳出,不能跳入)。
由于我个人并不习惯这么使用,因此不做说明。

break/continue

break 是彻底跳出当前的循环。
continue 则将控制转移到当前循环的起点。

return

return 是当前方法的出口,最后一站。
对于一个方法而言,走到这里,它的任务就算完成了。
void 方法也可以使用 return

1
2
3
4
private void returnInVoid() {
// 什么也不干,只是演示而已
return;
}