C'è un'istruzione goto in Java?


Answers

James Gosling ha creato la JVM originale con il supporto delle istruzioni goto , ma poi ha rimosso questa funzionalità come inutile. Il motivo principale per cui goto non è necessario è che di solito può essere sostituito con istruzioni più leggibili (come break/continue ) o estraendo un pezzo di codice in un metodo.

Fonte: James Gosling, sessione di domande e risposte

Question

Sono confuso su questo. Alla maggior parte di noi è stato detto che non c'è alcuna istruzione goto in Java.

Ma ho scoperto che è una delle parole chiave in Java. Dove può essere utilizzato? Se non può essere usato, perché è stato incluso in Java come parola chiave?




No, goto non è usato in Java, nonostante sia una parola riservata. Lo stesso è vero per const . Entrambi questi sono usati in C ++, che è probabilmente la ragione per cui sono riservati; l'intenzione era probabilmente quella di evitare di confondere i programmatori C ++ in migrazione verso Java, e forse anche di mantenere l'opzione di usarli nelle revisioni successive di Java.




Quindi potrebbero essere usati un giorno se i designer linguistici ne avessero sentito il bisogno.

Inoltre, se i programmatori di lingue che hanno queste parole chiave (ad esempio C, C ++) li usano per errore, allora il compilatore Java può dare un utile messaggio di errore.

O forse era solo per fermare i programmatori usando goto :)




Perché non è supportato e perché vorresti una parola chiave goto che non facesse nulla o una variabile chiamata goto ?

Sebbene tu possa usare l' break label; e continue label; dichiarazioni per fare efficacemente ciò che fa goto . Ma non lo raccomanderei.

public static void main(String [] args) {

     boolean t = true;

     first: {
        second: {
           third: {
               System.out.println("Before the break");

               if (t) {
                  break second;
               }

               System.out.println("Not executed");
           }

           System.out.println("Not executed - end of second block");
        }

        System.out.println("End of third block");
     }
}



Un esempio di come utilizzare le etichette "continue" in Java è:

public class Label {
    public static void main(String[] args) {
        int temp = 0;
        out: // label
        for (int i = 0; i < 3; ++i) {
            System.out.println("I am here");
            for (int j = 0; j < 20; ++j) {
                if(temp==0) {
                    System.out.println("j: " + j);
                    if (j == 1) {
                        temp = j;
                        continue out; // goto label "out"
                    }
                }
            }
        }
        System.out.println("temp = " + temp);
    }
}

risultati:

I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1



Perché sebbene il linguaggio Java non lo usi, il bytecode di JVM lo fa.







No, goto non viene utilizzato, ma è possibile definire etichette e lasciare un ciclo fino all'etichetta. Puoi usare break o continue seguito dall'etichetta. Quindi puoi saltare più di un livello di loop. Dai un'occhiata al tutorial .







È molto considerato una di quelle cose che non si fanno, ma probabilmente è stato elencato come una parola riservata per evitare confusione per gli sviluppatori.







La parola chiave esiste, ma non è implementata.

L'unica buona ragione per usare goto a cui riesco a pensare è questa:

for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        goto outsideloops; // to break out of both loops
    }
}
outsideloops:

In Java puoi fare questo in questo modo:

loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}



Links