2010-06-25 25 views
3

Je codais récemment un petit programme Java (en tant que conception pour un programme assembleur 8086) et je me suis retrouvé dans une position intéressante - je devais sortir d'une boucle d'un commutateur déclaration intérieure, quelque chose comme ça (pseudocode, évidemment):Utilisation appropriée de Multi-niveau Break en Java

:MyLoop 
While(foo) 
    switch (bar) 
     case '1': print '1'; break 
     case '0': print '0'; break 
     case ';': end while loop; 

Il semblait être l'endroit parfait pour une instruction goto parce qu'une seule « rupture » se retirerait seulement l'instruction switch, (surtout que j'étais conception pour l'assemblage) mais Java n'a pas de gotos!

J'ai trouvé à la place que Java a quelque chose appelé une rupture multi-niveau, donc en utilisant "break MyLoop", le programme sortirait à la fois du commutateur et la boucle while. '

Ma question alors - est-ce une utilisation appropriée d'une pause à plusieurs niveaux? Si, pour une raison ou pour une autre, je voulais conserver l'instruction (au lieu de, disons, imbriquée else ifs), existe-t-il une autre façon d'imiter une rupture multi-niveau via "break" ou "continue"?

+0

Pouvez-vous envoyer un code réel? Si nous pouvons comprendre ce que vous essayez de faire, alors nous pourrions fournir une aide réelle –

Répondre

11

Personnellement, je considère généralement cela comme un indice pour refactoriser la boucle dans sa propre méthode - alors vous pouvez revenir de la méthode entière au lieu de simplement sortir de la boucle.

Personnellement, je trouve cela plus clair dans la plupart des cas - mais sinon, c'est exactement le genre de chose pour laquelle les pauses étiquetées sont là. Il est généralement plus propre (IMO) que d'avoir une variable distincte boolean indiquant si la boucle doit continuer ou non.

+0

+1 pour 'hint pour refactoriser la boucle dans sa propre méthode' –

+0

Je l'avais à l'origine, mais l'un des paramètres (c'était une mission pour une partie d'un cours de l'Assemblée 8086) n'était aucun sous-programme. Merci de me donner un peu d'esprit. –

+0

Je fais cela aussi, quand je ne travaille pas pour une entreprise qui a une politique de "déclaration unique par méthode" – finnw

2

est-ce une utilisation appropriée d'une rupture à plusieurs niveaux?

Oui.

Existe-t-il une autre façon d'imiter une rupture à plusieurs niveaux par "break" ou "continue" seul?

Vous pouvez définir un indicateur booléen, puis rompre à chaque niveau.

+1

Il n'est pas nécessaire d'utiliser des indicateurs booléens pour les ruptures multiniveaux. Les déclarations break et continue peuvent être étiquetées pour se rapporter à des constructions externes au lieu des constructions les plus intimes 'cassables' ou 'continuables'. – jarnbjo

+0

@jarnbjo: En quoi est-ce alors une * alternative *? Vous venez de décrire à nouveau la pause multi-niveau. –

+0

@jarnbjo - La deuxième déclaration d'Aaron n'est qu'une réponse à la question hypothétique posée par le PO; il n'est évidemment pas donné comme recommandation. (Aaron +1) – dsmith

2

réponse de Jon Skeet dans le code:

public void doSomething() { 
    while(foo) { 
     switch (bar) { 
      case '1': print '1'; break; 
      case '0': print '0'; break; 
      case ';': return; //Effectively exits the loop 
     } 
    } 
} 
+0

Qu'est-ce que cela est censé changer? Il voulait dire refactoring le _loop_, pas la commande d'impression. Cela ne fait rien sur le problème avec multi-level-break. – f1sh

+1

@ f1sh: Non, c'est * ce que je voulais dire. La boucle est maintenant dans sa propre méthode, donc pour sortir de la boucle, il suffit de revenir de la méthode, au lieu d'utiliser la rupture à plusieurs niveaux. –

+1

@ f1sh - les bits pertinents sont la fonction doSomthing() et l'instruction return. Ceci remplace la rupture étiquetée. – dsmith