有没有办法将goto
语句机械翻译为if
,switch
,while
,break
和continue
语句等,还是函数调用,对象,什么?
答案 0 :(得分:9)
虽然这不是一个好主意,但可以使用循环和swith-case。在下面的示例中,当您进入continue时,goto变量决定要转到的标签(0,1,2或默认值)。
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;
}
}
答案 1 :(得分:6)
我认为这值得分享。我有一天在Reddit上看到了这个,它是通过自定义类加载器转到任意行号(在同一个.java文件中)的实现。这是一段有趣的代码。 http://steike.com/tmp/goto.zip。我不相信它。
编辑: 对于那些好奇但又不想下载zip并运行它的人,请查看以下文件:
public 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!
答案 2 :(得分:4)
Java语言不支持将gotos模拟到任意位置所需的功能(甚至不在同一方法中)。您可以使用您提到的构造实现goto
的一些简单用法,但不能以这种方式实现所有可能的goto
。 (*)
在字节代码级别上,您可以实现goto
(至少在方法中),但在这种情况下,该字节代码无法映射回有效的Java代码。
对于跨越方法或对象边界的goto
:这绝对是JVM级别上的一个大禁忌。整个Java安全模型依赖于代码可验证的事实,因此只定义了入口点(也称为“方法”)。
(*)免责声明:这假设你不想完全重构方法来实现goto的效果,这也可以调用代码重复并混淆方法的“正常”流程。由于您可以在Java方法中实现图灵机,因此您绝对可以在Java方法中实现“goto”; - )
答案 3 :(得分:3)
考虑到goto
可以根据其跳跃的位置创建的复杂性,这是非常值得怀疑的。
答案 4 :(得分:2)
当然:(为了清晰起见略微缩写)
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;
}
}
为什么你想做这样的事情超出我的范围,但是嘿,你可以 ......
答案 5 :(得分:0)
是的,使用你提到的方法的组合......这是可能的(任何事情都是可能的,只是弄清楚如何正确地做这件事是痛苦的。)
请记住,goto
会导致极其复杂的执行路径......因此,无论生成什么,都可能导致大量重复代码难看。
答案 6 :(得分:0)
在实践中,我想任何给定的示例goto
都可以转换为其他内容,特别是如果方法提取是允许的转换。这是一个抽象的问题,还是你真的有这么多的goto,你真的需要一个实际的工具?也许java代码本身是从某些东西机器翻译的?
我曾经把一个实际的goto
放到我写的每个程序中,只是为了惹恼纯粹主义者。