2011-06-24 6 views
4

Pouvez-vous inclure plusieurs variables dans une instruction switch en Java?Nombre de variables dans une instruction switch - Java

enum Facing { North, South, East, West } 

enum Forward { Right, Left } 

Forward forward; 

Facing facing; 

Integer myNumber; 

Donc, ça ressemble à ceci? Et si oui, comment pourrais-je aller sur la mise en œuvre

switch (facing, forward) { 
    case North, Right : facing 1 = East 
} 

Je sais que cela est faux mais se demande si une telle technique pourrait fonctionner et comment pourrais-je mettre en œuvre?

+0

La déclaration swicth peut changer uniquement les types primitve et enums.So pourquoi ne vous transformer tous vos énumérations en un seul numéro et que le mettre? –

Répondre

4

Vous pouvez faire comme ceci:

switch(facing) 
{ 
    case North: 
     switch(forward) 
     { 
       case Right: // blah blah 
       break; 
     } 
    break; 
} 
+0

C'est la façon de le faire. Vous pouvez même supprimer certaines des nouvelles lignes pour mettre le code sur une seule ligne pour le rendre plus lisible et plus concis. Si vous utilisez cette solution, n'oubliez pas de mettre "break" dans tous les bons endroits, car cela pourrait devenir incontrôlable rapidement avec toutes les permutations. –

+0

Oui cela fonctionne, mais sûrement une déclaration if serait plus belle et plus simple ici? 'if (facing == North && forward == Droite) {...} else if (...)' –

0

efficacement vous modélisez un ensemble de transitions d'état, quand vous êtes dans un état particulier (. Par exemple face au nord) certaines actions (par exemple, tourner 90 clocwise.) résultat dans un nouvel état (face à l'est)

Vous pouvez modéliser de telles choses avec une série d'instructions de commutation imbriquées ou autres. Je pense que vous pouvez faire mieux de modéliser les états en tant que classes explicites, peut-être dérivées d'une classe de base abstraite qui définit les actions.

Je soupçonne que si vos états ou actions deviennent légèrement plus complexes, vous trouverez que vous avez besoin des classes.

9

Eng.Fouad donne un moyen de contourner cela.

Une autre altenative pourrait être de créer une face plus complexe ENUM comme ceci:

enum Facing { 
    North { 
    Facing right() { return East; } 
    Facing left() { return West; } 
    }, 
    East { 
    Facing right() { return South; } 
    Facing left() { return North; } 
    }, 
    South { 
    Facing right() { return West; } 
    Facing left() { return East; } 
    }, 
    West { 
    Facing right() { return North; } 
    Facing left() { return South; } 
    }; 
    abstract Facing right(); 
    abstract Facing left(); 
} 

Une telle construction permet également de faciliter l'enchaînement de sorte que vous pouvez écrire une routine inverse générique comme ceci:

Facing reverse(Facing facing) { return facing.right().right(); } 
2

Cela semble comme il appartient à faire face:

enum Facing { 

    North, East, South, West; 

    public Facing turn(Forward f) { 
     return values()[(ordinal() + (f == Forward.Right ? 1 : 3)) % 4]; 
    } 
} 
2

A partir de JDK 7, vous pouvez simuler cela avec un commutateur sur une chaîne:

Facing facing = Facing.North; 
Forward forward = Forward.Right; 

String facingForward = facing + "-" + forward; 
switch(facingForward){ 
    case "North-Right": return East; 
    .. 
} 
Questions connexes