2012-05-07 6 views
2

Представьте у вас есть код Java, как это:Infame Гото, Java, автоматический код

public class MyClass { 
    public static Object doSmthg(Object A,Object B){ 
     if(smthg){ //if is given has an example, it can be any thing else 
      doSmthg; 
      GOTO label; 
     } 
     doSmthg; 

     label; 
     dosmthg1(modifying A and B); 
     return an Object; 
    } 
} 

Я генерации кода автоматически. Когда генератор приходит в момент генерации goto (и он не знает, что он находится в блоке if), он не знает, что будет потом.

Я попытался использовать ярлыки, перерыв, продолжить, но это не сработает.

Я попытался использовать внутренний класс (domthg1), но A и B должны быть объявлены окончательными. Проблема заключается в том, что A и B должны быть изменены.

Если нет других решений, мне придется распространять больше знаний в моем генераторе. Но я предпочел бы более простое решение.

Любые идеи?

Заранее спасибо.

+0

Так что вы хотите реализовать 'GOTO' в вашем генераторе кода Java? Зачем? Почему бы просто не использовать 'if-else'? – Thomas

ответ

1
public static Object doSmthg(Object A,Object B){ 
    try { 
    if(smthg){ //if is given has an example, it can be any thing else 
     doSmthg; 
     throw new GotoException(1); 
    } 
    doSmthg; 

    } catch (GotoException e) { 
     e.decrementLevel(); 
     if (e.getLevel() > 0) 
      throw e; 
    } 
    dosmthg1(modifying A and B); 
    return an Object; 
} 

можно сделать с исключением последовательно открывает, но для таргетинга правильный «ярлык» один либо должен проверить сообщение об исключении или думать уровня вложенности.

Я не знаю, нахожу ли я это не уродливым.

+0

Это довольно уродливое, да, но и довольно творческое. ;) – ZeroOne

+0

Блестящий! Мне нужна только одна метка в каждой функции. Я должен признать использование Исключений, чтобы это никогда не приходило мне в голову. Плохо, я не могу проголосовать за ваш пост. – rvlander

1

Вы можете добавить фиктивную петлю вокруг блока, предшествующей метку и использовать меченый разрыв как эквивалент Goto:

public static Object doSmthg(Object A,Object B){ 
    label: 
    do { // Labeled dummy loop 
     if(smthg){ //if is given has an example, it can be any thing else 
      doSmthg; 
      break label; // This brings you to the point after the labeled loop 
     } 
     doSmthg; 
    } while (false); // This is not really a loop: it goes through only once 
    dosmthg1(modifying A and B); 
    return an Object; 
} 
+0

Отличный! Большое спасибо! – rvlander

1

Если вы хотите перейти на что-то, например, так:

A 
if cond goto c; 
B 
c: C 

вы можете сделать это, как

while (true) { 
    A 
    if cond break; 
    B 
} 
C 
+0

Это просто продолжает выполнение A, не очень хорошо. У Dasblinkenlight есть лучшее решение: 'do {...} while (false)'. – ZeroOne

+0

Это решение нуждается в знаниях из генератора кода, если goto уже находится в цикле (например, «if»). – rvlander

+0

коммутатор с футляром падения и 'if (cond) break;' тоже подойдет. –