Quand une instruction null serait-elle utilisée en Java?

10

Dans un manuel que j'ai cherché pour une classe, il est dit qu'une déclaration peut être vide (la déclaration nulle). L'instruction null est définie comme un simple point-virgule.

Il ne fait absolument rien au moment de l'exécution. L'instruction null est rarement utilisée.

En tant que programmeur moyennement expérimenté, je trouve intéressant qu'ils disent rarement utilisé, cela implique que quelque part, il y a une utilité.

Quelle pourrait être l'utilisation d'une telle déclaration?

Bassinateur
la source

Réponses:

7

C'est surtout inutile, mais il y a quelques endroits où c'est nécessaire. Par exemple:

while (DoSomething());

Cela exécute la DoSomething()méthode jusqu'à ce qu'elle renvoie false. Évidemment, cela suppose que la méthode effectue également des effets secondaires utiles. Mais l'instruction vide, c'est-à-dire le point-virgule de fin, est requise, sinon la boucle while inclurait à la place l'instruction suivante.

(Mais pour contredire les autres réponses, ce for(;;) {}n'est pas un exemple d'instructions vides, puisque la parenthèse après une clause for ne contient pas d'instructions, elle utilise simplement le point-virgule pour séparer les expressions (facultatives). Voir la grammaire Java pour plus de détails.)

JacquesB
la source
3
+1 - c'est la seule fois où je l'ai vu vraiment utilisé (comme indiqué, les sections vides d'une instruction 'for' sont légèrement différentes). Le seul changement que je ferais est de souligner qu'il est loin d'être déroutant de lire ce type d'utilisation si l'instruction null est laissée sur sa propre ligne, plutôt qu'immédiatement après la boucle while, où elle ressemble à une instruction ordinaire terminator ...
Jules
12

Vous pouvez l'utiliser lorsqu'une instruction est requise syntaxiquement mais pas sémantiquement. Le cas le plus courant consiste à omettre l'une des parties d'une boucle for, comme cet exemple , bien que la plupart des gens trouvent cette utilisation étrange et difficile à lire. Comme le dit votre livre, il est rarement utilisé.

Karl Bielefeldt
la source
Cette. Est une fonctionnalité de langage inutile. Je serais plutôt obligé de lire explicitement la duplication que d'avoir à Google "seulement un java point-virgule".
Chris Cirefice
2
@ChrisCirefice D'un autre côté "seulement un point-virgule: est assez évident ce qu'il devrait faire étant donné que vous connaissez modérément la langue. Ce n'est pas une règle distincte, c'est juste une conséquence d'autres règles. De plus, si vous l'apprenez une fois que vous la connaissez pour toujours, donc je dirais que ce n'est pas vraiment un problème.
Maurycy
1
Si vous sentez que si vous vous retrouvez à écrire des boucles comme ça, vous faites quelque chose de mal.
Bassinator
J'ai une méthode d'interrogation du sommeil que j'utilise pour vérifier quand un appareil revient en ligne. Le code ressemble à peu près à ceci while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }:, le tout sur des lignes distinctes, bien sûr. J'aurais pu l'écrire ainsi while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, mais ce serait faux.
BobDalgleish
Ce n'est pas une déclaration nulle que nous utilisons également pour forcer la sortie des méthodes «void»? void method(){ //code here. If(condition){return ;}}.
Laiv
9

Je préfère utiliser une boucle while , mais une expression nulle vous permet d'écrire ceci:

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

Cependant, une déclaration nulle vous permet d'écrire ceci:

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

Le but principal est de perdre le temps du pauvre programmeur de maintenance qui vient après vous et se demande pourquoi le thread ne fonctionne pas. Une déclaration doit suivre un certain temps. Seul ; est une déclaration. Donc, ce bloc d'instructions ne fait pas réellement partie de la boucle.

Cela ne veut pas dire qu'il n'y a pas de bonnes utilisations. Ils sont juste rares. Ils ressemblent généralement à ceci:

{
    ;
}

Parce que de cette façon, cela ressemble plus à ce que vous voulez faire (même cela ne suffit parfois pas).

Dans l'assembly, cette instruction nulle est appelée NOP . En Python, cela s'appelle un laissez - passer . En java (et les autres enfants de c), c'est un point-virgule comme vous l'avez dit, ou même affirmer vrai;

Je connais quelques utilisations:

Sémantique .

Il y a une différence entre un espace vide et la mise à zéro comme réponse. Cela dit clairement, non, je n'ai pas oublié de mettre quelque chose ici. Ce rien n'est censé être rien. Ce n'est rien explicite. Cet espace laissé intentionnellement vide. C'est ainsi que nous obtenons N / A à compiler.

Le modèle nul

Imaginez une machine de signalisation lumineuse compliquée et coûteuse qui a ramassé à plusieurs reprises une ampoule colorée d'un tapis roulant, l'a vissée dans une prise, l'a mise sous tension, l'a retirée et a ramassé la suivante. Vous pouvez contrôler ce que cette chose signale par la couleur des ampoules que vous mettez sur la ceinture. Génial, maintenant que cela fonctionne parfaitement, votre patron veut que vous créiez un moyen de contrôler la synchronisation de ces signaux. Il veut ajouter un espace entre les messages. Vous vous souvenez avec horreur que de nombreuses parties se soucient de la synchronisation de ces signaux et de la difficulté de les synchroniser. Comment allez-vous contrôler le timing sans que cela vous garde au travail pendant le week-end? Vous regardez un bac d'ampoules grillées et vous vous faites une idée, enfin pas vraiment, brillante.

Parfois, vous voulez utiliser le polymorphisme pour simplement désactiver quelque chose sans rien casser.

Débogage

Lorsque vous définissez un point d'arrêt, vous devez disposer d'un emplacement pour le point d'arrêt. Maintenant, bien sûr, certains débogueurs vous permettront de le définir sur l'accolade de fermeture, mais s'ils ne le font pas, c'est bien que le langage vous permette de forcer un endroit pour en mettre un même si cet endroit ne fait rien.

Pas vraiment java mais il y a aussi:

Violonage binaire

L'instruction NOP des assemblages permet de manipuler l'exécutable binaire compilé. Mais les compilateurs java modernes optimisent tellement loin, je ne suis pas sûr que le point-virgule ne se contente pas de poof. Mais dans le passé, nous utilisions également ces espaces vides dans l'exécutable pour contrôler le timing ou nous permettre de nous accrocher plus tard. Sans le NOP, il y aurait des instructions réelles, donc si vous vouliez accrocher, vous devriez copier ces instructions ailleurs pour faire de la place pour le crochet. Cela fonctionne aussi bien dans le langage c dont Java tire une grande partie de sa syntaxe. Mais je ne pense pas que ce violon de crochet se produise beaucoup en Java. Nous utilisons la programmation orientée aspect pour ce faire.

candied_orange
la source
2
Cela peut sembler pédant, mais l'exemple avec forn'est pas des instructions nulles. Des instructions nulles (alias instructions vides) peuvent se produire au même endroit où d'autres instructions (comme une if) peuvent se produire, mais les parenthèses suivantes forn'autorisent pas les instructions entre les points-virgules, mais uniquement un initialiseur et deux expressions, qui se trouvent être facultatives. C'est donc une utilisation différente du point-virgule que comme terminateur de statment. Une déclaration vide serait le dernier point-virgule defor(;;);
JacquesB
Vous avez raison, cela semble pédant: P. Très bien, veuillez noter ma modification.
candied_orange
-7

Je l'utilise parce que Java est conçu d'une manière qui n'est pas conforme au langage humain. Il en va de même pour C.

Une déclaration est statement;.

Une instruction if-then-else est if (condition) statement; else statement;

Une instruction if-then-else avec des blocs composés est if (condition) {statements} else {statements}

C'est clairement un non-sens.

J'écris donc if (condition) {statements} else {statements};ce qui est logique et raisonnable.

Si les concepteurs de Java veulent traiter cela comme si-alors-sinon suivi d'une déclaration nulle, ça me va. Si cela les rend heureux, que cela les rend heureux.

Martin Kochanski
la source
Ça l'est if (condition) {statements;} else {statements;}. De plus, Java est assez cohérent pour ne pas avoir besoin de ;s après }. Un peu comme la façon dont les langues humaines ne collent pas souvent une période à la fin d'une phrase qui se termine déjà par un point d'interrogation. (Bien sûr, il y a les !?ou ?!fins, mais ce ne sont que des approximations de la caractère interrobang .)
8bittree
1
Doux dieu !! o_O
Áxel Costas Pena