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?
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é.
la source
while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }
:, le tout sur des lignes distinctes, bien sûr. J'aurais pu l'écrire ainsiwhile ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }
, mais ce serait faux.void method(){ //code here. If(condition){return ;}}
.Je préfère utiliser une boucle while , mais une expression nulle vous permet d'écrire ceci:
Cependant, une déclaration nulle vous permet d'écrire ceci:
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.
la source
for
n'est pas des instructions nulles. Des instructions nulles (alias instructions vides) peuvent se produire au même endroit où d'autres instructions (comme uneif
) peuvent se produire, mais les parenthèses suivantesfor
n'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(;;);
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.
la source
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 .)