将goto语句转换为if,switch,while,break等

unk*_*own 4 java syntax goto

有没有一种方法,以机械翻译goto语句if,switch,while,break,和continue报表等,或函数调用,对象,什么?

Mar*_*ius 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @Marius:在我看来,"0"和"1"分别是*不等同于`false`和`true`的事实是Java中最好的决定之一;-) (6认同)
  • 实际上对于那个代码块本身并不是什么坏主意(虽然我不知道我是否会使用它来解决没有goto的问题)这只是一个有限状态机的基本实现,它有很多合法的目的. (2认同)

Fal*_*ina 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);            
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它将打印:

   3
   2
   1
   0
   Hello World!
Run Code Online (Sandbox Code Playgroud)

  • 这很有趣......以一种可怕的方式. (7认同)