在以前写C程序中经常会有这样的情景.
打开一个资源的句柄.
在打开的这个资源上操作进行多次操作,每一步失败都要关闭这个资源句柄并摧毁它:
if(x1) { close(hd);destory(hd);}
if(x2) { close(hd);destory(hd);}
if(x3) { close(hd);destory(hd);}
等等,如果操作超过3条语句,比如有七八条头十头语句,第个条件分支中都写相同的代码,至少从视觉上感觉自己是一个入门者.
于是C程序会把这些操作写到一个地方加标号,然后每个条件分支中goto过去就行了.
但是在java中,goto肯定不行,有人会把相同的操作封装到一个方法中.每个条件分支中调用这个方法.这当然不失为为一个优雅的方法.
但是...............................
这些共同操作中所要操作的所有变量要作为参数传给方法.而有些参数传递并不是一件容易的事.特别是内部类的参数传递.
那么有什么方法可以象C的goto那样呢?在一定条件下跳过下面的操作直接转到共同的操作代码?
do{}while(false);就可以非常方便地解决这个问题,就实就是利用循环控制的break来跳过下面的操作直接转到循环外来操作.
而把不是循环的逻辑用循环封装起来,那么"只循环一次"就解决的方法,当然你用for(int i=0;i<1;i++){}也行.用
while(true){ }然后最后在{}里的最后一行加break也行,但从优雅的角度说do{}while(false);最好,好最符合它设计的"至少执行一次"
的原意.
do{
其它运算语句;
if(x1) break;
其它运算语句;
if(x2) break;
}while(false);
共同操作语句;
如果满足x1条件,则流程直接转到共同操作语句执行.起到了goto的作用.