有没有一种机械化的方法来将goto
语句转换成if
、switch
、while
、break
和continue
语句,或者使用函数调用、对象等方式?
虽然这并不是一个好主意,但可以使用循环和switch-case语句。在下面的例子中,goto变量决定了当遇到continue时跳转到哪个标签(0、1、2或default)。
int goTo=0;
while(true){
switch(goTo){
case 0:
doSomething();
goTo = 1;
continue;
case 1:
doSomethingElse();
goTo = 2;
continue;
case 2:
doSOmethingDifferent();
goTo = 0;
continue;
default:
return;
}
}
while(true)
- pjppublic class GotoDemo {
public static void main(String[] args) {
int i = 5;
System.out.println(i);
i = i - 1;
if (i >= 0) {
GotoFactory.getSharedInstance().getGoto().go(4);
}
try {
System.out.print("Hell");
if (Math.random() < 2) throw new Exception();
System.out.println("World!");
} catch (Exception e) {
System.out.print("o ");
GotoFactory.getSharedInstance().getGoto().go(13);
}
}
}
3 2 1 0 Hello World!
考虑到goto
语句可能在跳转时引起的复杂性,这是非常可疑的。
goto
用途,但无法通过这种方式实现所有可能的goto
用途。在字节码级别上,您可能可以实现goto
(至少在一个方法内),但在这种情况下,该字节码无法映射回有效的Java代码。至于跨越方法或对象边界的goto
:这对JVM来说绝对是大忌。整个Java安全模型取决于代码可验证,并且具有仅定义的入口点(也称为“方法”)。免责声明:假定您不想完全重构方法以实现goto效果,这可能还会调用代码复制并混淆方法的“正常”流程。由于您可以在Java方法中实现图灵机,因此您肯定可以在Java方法中实现“goto”;-)int goTo = 0; boolean done = false;
while (!done) {
switch (goTo) {
default:
case 1: System.out.println("We're at line 1!"); goTo = 2; break;
case 2: System.out.println("We're going to line 4!"); goTo = 4; break;
case 3: System.out.println("We're at line 3 and we're done!"); done = true; break;
case 4: System.out.println("We're at 4, going to 2! Screw you, line 3!"); goTo = 2; break;
}
}
我不知道你为什么想要这样做,但是嘿,你可以...
是的,使用你提到的方法的组合...是可能的(实际上任何事情都是可能的,只是找出如何正确地做这件事是一件痛苦的事情)。
请记住,goto
可能会导致非常复杂的执行路径...因此可能会在生成的任何内容中导致大量不美观的重复代码。
goto
示例都可以被翻译成其他东西,特别是如果允许方法提取转换。这是一个抽象的问题还是你真的有很多goto需要一个实际的工具?也许Java代码本身是从某个地方机器翻译过来的?goto
,只是为了惹恼那些纯粹主义者。