redimensionar - ¿Hay una declaración goto en Java?
scale icon java (23)
¿Porque no es compatible y por qué querría una palabra clave goto
que no hizo nada o una variable llamada goto
?
Aunque puedes usar break label;
y continue label;
Declaraciones para hacer efectivamente lo que hace goto
. Pero no lo recomendaría.
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");
}
}
Estoy confundido acerca de esto. A la mayoría de nosotros se nos ha dicho que no hay ninguna declaración goto en Java.
Pero encontré que es una de las palabras clave en Java. ¿Donde puede ser usado? Si no se puede usar, ¿por qué se incluyó en Java como palabra clave?
Así que podrían usarse algún día si los diseñadores de idiomas sintieran la necesidad.
Además, si los programadores de lenguajes que tienen estas palabras clave (por ejemplo, C, C ++) los usan por error, entonces el compilador de Java puede dar un mensaje de error útil.
O tal vez fue solo para detener a los programadores usando goto :)
Como se señaló, no hay goto
en Java, pero la palabra clave estaba reservada en caso de que Sun tuviera ganas de agregar goto
a Java algún día. Querían poder agregarlo sin romper demasiado código, por lo que reservaron la palabra clave. Tenga en cuenta que con Java 5 agregaron la palabra clave enum
y tampoco rompió tanto código.
Aunque Java no tiene goto
, tiene algunas construcciones que corresponden a algunos usos de goto
, a saber, ser capaz de break
y continue
con bucles con nombre. Además, finally
, finally
puede considerar como una especie de goto
retorcido.
Es importante comprender que el constructo goto
es un remanente de los días programados por los programadores en código de máquina y lenguaje ensamblador. Debido a que esos lenguajes son tan básicos (como en, cada instrucción hace solo una cosa), el flujo de control del programa se realiza completamente con sentencias goto
(pero en lenguaje ensamblador, estas se denominan instrucciones de salto o ramificación ).
Ahora, aunque el lenguaje C es de un nivel bastante bajo, puede considerarse como un lenguaje ensamblador de muy alto nivel: cada declaración y función en C se puede dividir fácilmente en instrucciones en lenguaje ensamblador. Aunque C no es el lenguaje principal para programar computadoras con la actualidad, todavía se usa mucho en aplicaciones de bajo nivel, como los sistemas integrados. Debido a que la función de C refleja fielmente la función del lenguaje ensamblador, solo tiene sentido que goto
esté incluido en C.
Está claro que Java es una evolución de C / C ++. Java comparte muchas características de C, pero resume muchos más detalles y, por lo tanto, está escrito de manera diferente. Java es un lenguaje de muy alto nivel, por lo que simplemente no es necesario tener características de bajo nivel como goto
cuando hay más construcciones de alto nivel como funciones, para cada uno, y mientras que los bucles hacen el flujo de control del programa. Imagínese si estuviera en una función e hiciera un goto
a una etiqueta en otra función. ¿Qué pasaría cuando la otra función regresara? Esta idea es absurda.
Esto no necesariamente responde por qué Java incluye la instrucción goto
pero aún no permite que se compile, pero es importante saber por qué se usó goto
en primer lugar, en aplicaciones de nivel inferior, y por qué simplemente no tiene sentido para ser utilizado en Java.
Es muy considerado como una de esas cosas que no haces, pero probablemente fue incluido como una palabra reservada para evitar confusiones para los desarrolladores.
Están reservados para uso futuro (ver: Palabras clave del lenguaje Java )
Las palabras clave const y goto están reservadas, aunque no se utilicen actualmente.
La razón por la que no hay una declaración goto en Java se puede encontrar en " El entorno del lenguaje Java ":
Java no tiene ninguna declaración goto. Los estudios ilustran que goto se usa (mal) con más frecuencia que simplemente "porque está ahí". Eliminar goto condujo a una simplificación del lenguaje; no hay reglas sobre los efectos de un goto en el medio de una declaración for, por ejemplo. Los estudios en aproximadamente 100,000 líneas de código C determinaron que aproximadamente el 90 por ciento de las declaraciones goto se utilizaron únicamente para obtener el efecto de romper los bucles anidados. Como se mencionó anteriormente, la interrupción multinivel y continuar eliminan la mayor parte de la necesidad de declaraciones goto.
James Gosling creó la JVM original con soporte para goto
sentencias, pero luego eliminó esta característica por innecesaria. La razón principal por la que no es necesario goto
es que generalmente se puede reemplazar con declaraciones más legibles (como break/continue
) o extrayendo un fragmento de código en un método.
La palabra clave existe, pero no está implementada.
La única buena razón para usar goto que se me ocurre es la siguiente:
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:
En Java puedes hacer esto así:
loops:
for (int i = 0; i < MAX_I; i++) {
for (int j = 0; j < MAX_J; j++) {
// do stuff
break loops;
}
}
No, goto
no se usa en Java, a pesar de ser una palabra reservada. Lo mismo es cierto para const
. Ambos se utilizan en C ++, que es probablemente la razón por la que están reservados; la intención era probablemente evitar confundir a los programadores de C ++ que migran a Java, y quizás también mantener la opción de usarlos en revisiones posteriores de Java.
No, afortunadamente, no hay goto
en Java.
La palabra clave goto
solo está reservada, pero no se usa (lo mismo ocurre con const
).
No, no se utiliza goto
, pero puede definir etiquetas y dejar un bucle hasta la etiqueta. Puedes usar break
o continue
seguido de la etiqueta. Así que puedes saltar más de un nivel de bucle. Echa un vistazo al tutorial .
Por supuesto, es una palabra clave, pero no se usa en el nivel del código fuente.
Pero si usa jasmin u otro lenguaje de nivel inferior, que se transforma en bytecode, entonces "goto" está ahí
Porque aunque el lenguaje Java no lo usa, el bytecode JVM sí lo hace.
Prohibir declaraciones de variables con el mismo nombre.
por ejemplo, int i = 0, goto;
Tampoco soy fan de goto
, ya que generalmente hace que el código sea menos legible. Sin embargo, creo que hay excepciones a esa regla (¡especialmente cuando se trata de lexers y analizadores!)
Por supuesto, siempre puedes llevar tu programa a Kleene Normalform al traducirlo a algo como un ensamblador y luego escribir algo como
int line = 1;
boolean running = true;
while(running)
{
switch(line++)
{
case 1: /* line 1 */
break;
case 2: /* line 2 */
break;
...
case 42: line = 1337; // goto 1337
break;
...
default: running = false;
break;
}
}
(Así que básicamente escribe una máquina virtual que ejecuta su código binario ... donde la line
corresponde al puntero de instrucción)
Eso es mucho más legible que el código que usa goto
, ¿no es así?
Tenga en cuenta que puede reemplazar la mayoría de los usos benignos de goto por
regreso
descanso
etiqueta de rotura
tirar dentro de try-catch-finalmente
Un ejemplo de cómo usar las etiquetas de "continuar" en Java es:
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);
}
}
Resultados:
I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1
Vea que el siguiente enlace muestra todas las palabras reservadas de java y le dice qué versiones se agregaron.
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
goto está reservado, aunque no se usa actualmente, nunca digas nunca, sin embargo :)
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto
Si le han dicho que no hay ninguna declaración de goto en Java, se lo ha engañado. De hecho, Java consiste en dos capas de código ''fuente''.
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
"Las palabras clave const y goto están reservadas, aunque no se usan actualmente".
goto no está en Java
tienes que usar GOTO pero no funciona correctamente. En la palabra clave de Java no se usa. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
public static void main(String[] args) {
GOTO me;
//code;
me:
//code;
}
}
La lista de palabras clave de Java especifica la palabra clave goto
, pero está marcada como "no utilizada".
Estaba en la JVM original (ver respuesta por @VitaliiFedorenko ), pero luego se eliminó. Probablemente se mantuvo como una palabra clave reservada en caso de que se agregara a una versión posterior de Java.
Si goto
no estaba en la lista, y se agrega al lenguaje más adelante, el código existente que usaba la palabra goto
como un identificador (nombre de variable, nombre de método, etc.) se rompería. Pero debido a que goto
es una palabra clave, dicho código ni siquiera se compilará en el presente, y sigue siendo posible hacer que haga algo más adelante, sin romper el código existente.