继续!一个能解决复杂问题的方案,大家讨论一下吧! void foo() { L1: // do something for(;;) { while(true) { goto L2; } L2: goto L3; } L3: // do something goto L1 } 如果用内部类实现: void foo() { class A { int start() { // do something if( L1() == -1) return -1; return 0; } int L1() { for(;;) { class AA { int start() { while(true) { return L2(); } if(L2() == -1) return -1; return 0; }
int L2() { if(true) return L3(); return 0; } }// end of class AA AA AA = new AA(); if( AA.start() == -1) return -1; }// end of for }// end of L1; int L3() { // do something if( L1() == -1) return -1; return 0; } A a = new A(); a.start(); }
private void normalMethod()
{
..............
goto1() ;
...............
goto2() ;
................
} private void goto1()
{
..........
..........
normalMethod() ;
} private void goto2()
{
..........
..........
normalMethod() ;
}
//java's "labeled for" loop.
public class LabeledFor
{
public static void main(String args[])
{
int i=0;
outer://can't have statements here
for(;true;)
{
//infinite loop
inner://Can't have statements here
for(;i<10;i++)
{
prt("i="+i);
if(i==2)
{
prt("continue");
continue;
}
if(i==3)
{
prt("break");
i++;//Otherwise i never
//gets incremented.
break;
}
if(i==7)
{
prt("continue");
i++;//Otherwise i never
//gets incremented.
continue outer;
}
if(i==8)
{
prt("break outer");
break outer;
}
for(int k=0;k<5;k++)
{
if(k==3)
{
prt("continue inner");
continue inner;
}
}
}
}
//Can't break or continue
//to labels here
}
static void prt(String s)
{
System.out.println(s);
}
}运行结果:
i=0
continue inner
i=1
continue inner
i=2
continue
i=3
break
i=4
continue inner
i=5
continue inner
i=6
continue inner
i=7
continue outer
i=8
continue outer
不过我最近突发奇想:能不能用一个内部类(inner class)实现goto?看如下代码:
void foo()
{
// do something
for(;;;)
{
while(true)
{
goto L2;
void foo()
{
L1:
// do something
for(;;)
{
while(true)
{
goto L2;
}
L2:
goto L3;
}
L3:
// do something
goto L1
}
如果用内部类实现:
void foo()
{
class A {
int start() {
// do something
if( L1() == -1)
return -1;
return 0;
}
int L1() {
for(;;)
{
class AA {
int start()
{
while(true)
{
return L2();
}
if(L2() == -1)
return -1;
return 0;
}
int L2() {
if(true)
return L3();
return 0;
}
}// end of class AA
AA AA = new AA();
if( AA.start() == -1)
return -1;
}// end of for
}// end of L1;
int L3() {
// do something
if( L1() == -1)
return -1;
return 0;
}
A a = new A();
a.start();
}