¿Cuándo se usaría una declaración nula en Java?

10

Se dice que en un libro de texto que he estado buscando una clase, una declaración puede estar vacía (la declaración nula). La declaración nula se define como solo un punto y coma.

No hace absolutamente nada en tiempo de ejecución. La declaración nula rara vez se usa.

Como programador con experiencia moderada, me parece interesante que digan que rara vez se usa, esto implica que en algún lugar, hay un uso para él.

¿Cuál podría ser el uso de tal declaración?

Bajista
fuente

Respuestas:

7

En su mayoría es inútil, pero hay algunos lugares donde es necesario. Por ejemplo:

while (DoSomething());

Esto ejecuta el DoSomething()método hasta que devuelva falso. Obviamente, esto supone que el método también realiza algunos efectos secundarios útiles. Pero se requiere la declaración vacía, es decir, el punto y coma final, de lo contrario el ciclo while incluiría la siguiente declaración siguiente.

(Pero para contradecir las otras respuestas, nofor(;;) {} es un ejemplo de declaraciones vacías, ya que el paréntesis después de una cláusula for no contiene declaraciones, solo usa el punto y coma para separar las expresiones (opcionales). Consulte la gramática de Java para obtener más detalles).

JacquesB
fuente
3
+1: esta es la única vez que lo he visto realmente utilizado (como se dijo, las secciones vacías de una declaración 'for' son ligeramente diferentes). El único cambio que haría es señalar que es mucho más confuso leer este tipo de uso si la declaración nula se deja en su propia línea, en lugar de inmediatamente después del ciclo while, donde solo parece una declaración ordinaria terminator ...
Jules
12

Puede usarlo cuando una declaración es sintácticamente requerida pero no semánticamente requerida. El caso más común es omitir una de las partes de un bucle for, como este ejemplo , aunque la mayoría de las personas encuentran que el uso es extraño y difícil de leer. Como dice tu libro, rara vez se usa.

Karl Bielefeldt
fuente
Ese. Es una característica de lenguaje inútil. Prefiero estar obligado a leer explícitamente la duplicación que tener que buscar en Google "solo un punto y coma java".
Chris Cirefice
2
@ChrisCirefice Por otro lado "solo un punto y coma: es bastante obvio lo que debe hacer teniendo en cuenta que conoces el idioma moderadamente. No es una regla separada, es solo una consecuencia de otras reglas. Además, si lo aprendes una vez que lo sepas para siempre, así que diría que no es realmente ningún problema.
Maurycy
1
Si siente que se encuentra escribiendo bucles como ese, está haciendo algo mal.
Bassinator
Tengo un método de sondeo de sueño que utilizo para verificar cuando un dispositivo vuelve a estar en línea. El código se ve más o menos así: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }todo en líneas separadas, por supuesto. Podría haberlo escrito como while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, pero eso estaría mal.
BobDalgleish
¿No es una declaración nula lo que usamos también para forzar una salida de los métodos 'nulos'? void method(){ //code here. If(condition){return ;}}.
Laiv
9

Prefiero usar un bucle while , pero una expresión nula te permite escribir esto:

for (;;) { thread.run(); }

Sin embargo, una declaración nula le permite escribir esto:

while(true);
{
    thread.run();
}

El objetivo principal es perder el tiempo del pobre programador de mantenimiento que viene detrás de ti y se pregunta por qué el hilo no se está ejecutando. Una declaración debe seguir un rato. Un solitario; Es una declaración. Entonces, este bloque de declaración no es realmente parte del ciclo.

Eso no quiere decir que no haya buenos usos. Solo son raros. Suelen verse así:

{
    ;
}

Porque de esta manera parece que quieres hacer eso (incluso esto a veces no es suficiente).

En conjunto, esta declaración nula se denomina NOP . En Python se llama un pase . En java (y los otros hijos de c) es un punto y coma como has dicho, o incluso afirmar verdadero;

Sé de algunos usos:

Semántica .

Hay una diferencia entre un espacio vacío y poner un cero como respuesta. Dice claramente, no, no me olvidé de poner algo aquí. Esto nada debe ser nada. No es nada explícito. Este espacio fue intencionalmente dejado en blanco. Así es como obtenemos N / A para compilar.

El patrón nulo

Imagine una máquina de señalización luminosa complicada y costosa que recogió repetidamente una bombilla de color de una cinta transportadora, la atornilló a un enchufe, la encendió, la quitó y recogió la siguiente. Podrías controlar lo que indica esta cosa por el color de las bombillas que pones en el cinturón. Genial, ahora que finalmente está funcionando perfectamente, tu jefe quiere que crees una forma de controlar el tiempo de estas señales. Quiere agregar una brecha entre los mensajes. Recuerdas con horror que muchas partes se preocupan por el momento de estas señales y qué dolor fue sincronizarlas. ¿Cómo vas a controlar el tiempo sin que esto te mantenga en el trabajo durante el fin de semana? Miras un contenedor de bombillas quemadas y obtienes, bueno, no literalmente, una idea brillante.

A veces quieres usar el polimorfismo para apagar algo sin romper nada.

Depuración

Cuando establece un punto de interrupción, necesita que haya un lugar para el punto de interrupción. Ahora, seguro que algunos depuradores le permitirán configurarlo en la llave de cierre, pero si no lo hacen, es bueno que el lenguaje le permita forzar que haya un lugar para colocar uno, incluso si ese lugar no hace nada.

No es realmente una cosa de Java, pero también hay:

Violín binario

La instrucción NOP de ensamblajes permite jugar con el ejecutable binario compilado. Pero los compiladores modernos de Java se optimizan tanto que no estoy seguro de que el punto y coma no se vaya solo. Pero en los viejos tiempos también usábamos estos espacios vacíos en el ejecutable para controlar el tiempo o permitirnos caer en un gancho más tarde. Sin el NOP, habría instrucciones reales allí, así que si quisieras engancharlo, tendrías que copiar esas instrucciones en otro lugar para dejar espacio para el gancho. Esto funciona igual de bien en el lenguaje c del que Java obtiene gran parte de su sintaxis. Pero no creo que este enganche de gancho ocurra mucho en Java. Usamos la Programación Orientada a Aspectos para hacer eso.

naranja confitada
fuente
2
Esto puede parecer pedante, pero el ejemplo con forno es declaraciones nulas. Las declaraciones nulas (también conocidas como declaraciones vacías) pueden aparecer en el mismo lugar donde pueden aparecer otras declaraciones (como una if), pero los paréntesis siguientes forno permiten declaraciones entre los puntos y comas, sino solo un inicializador y dos expresiones, que resultan ser opcionales. Por lo tanto, es un uso diferente del punto y coma que como un terminador de declaración. Una declaración vacía sería el último punto y coma enfor(;;);
JacquesB
Tienes razón, esto parece pedante: P. Bien, ten en cuenta mi edición.
candied_orange
-7

Lo uso porque Java está diseñado de una manera que no es congruente con el lenguaje humano. Lo mismo es cierto de C.

Una declaración es statement;.

Una declaración if-then-else es if (condition) statement; else statement;

Una instrucción if-then-else con bloques compuestos es if (condition) {statements} else {statements}

Esto es claramente una tontería.

Por consiguiente, escribo lo if (condition) {statements} else {statements};que es lógico y razonable.

Si los diseñadores de Java quieren tratar esto como si fuera entonces seguido de una declaración nula, estoy de acuerdo con eso. Si los hace felices, déjelos felices.

Martin Kochanski
fuente
Es if (condition) {statements;} else {statements;}. Además, Java es bastante consistente sobre no necesitar ;s después }. Algo así como que los lenguajes humanos a menudo no pegan un punto al final de una oración que ya termina con un signo de interrogación. (Claro, hay las !?o ?!los finales, pero los que son sólo aproximaciones de , el carácter interrobang .)
8bittree
1
Dulce dios !! o_O
Áxel Costas Pena