Alternative à l'Interrupteur de Cas en Java
Est-il une autre façon de mettre en œuvre un commutateur cas en Java, d'autres que si d'autre qui n'est pas à la recherche de bonnes. Un ensemble de valeurs, il y en combinaison, en fonction de la sélection de la méthode correspondante doit être exécutée.
Que voulez-vous dire lorsque vous dites "Un ensemble de valeurs sera là dans la combo"?
Déjà demandé la même question stackoverflow.com/questions/126409/...
Alors, POURQUOI avez-vous demander à nouveau? Ce qui n'a pas les réponses précédentes dites-vous?
na pas vu avant
Déjà demandé la même question stackoverflow.com/questions/126409/...
Alors, POURQUOI avez-vous demander à nouveau? Ce qui n'a pas les réponses précédentes dites-vous?
na pas vu avant
OriginalL'auteur Biju CD | 2009-09-15
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous avez du mal avec l'exigence de cas est constante. C'est généralement un code d'odeur, mais il ya des choses que vous pouvez faire. Vous pouvez augmenter et de lien à une autre question que les détails de pourquoi vous êtes en train de basculer.
Dans l'exemple ci-dessus, vous pourriez à la carte de "gestionnaires", quelque chose comme
ce qui rend tout cela se transformer en une recherche.
Encore une fois, c'est un peu de l'odeur, de sorte s'il vous plaît poster une question qui illustre le raisonnement.
la recherche de quelque chose de ce genre.
Pourquoi ne le contient et puis obtenir, votre lecture de la carte deux fois. Commande commentaire = map.get( clé ); if( null != de commande ){ ...de commande.execute(); }
En fonction de la mise en œuvre, l'contient peut-être pas trop cher. Savoir si il y a une entrée vous permet également de gérer un "défaut" de l'action dans un raisonnablement manière lisible. L'optimisation prématurée et tout ça. Ce fait est probablement une gueule de bois de ma faire cela assez souvent en Perl pour éviter autovivification...
De prendre les Enums un peu plus loin, vous pouvez configurer chaque constante enum avec une méthode de gestion, de prise de valeur.doSomthing().
OriginalL'auteur ptomli
Si vous avez beaucoup de switch/case états autour de votre code et ils sont vous rend fou.
Vous pouvez opter pour le Refactoring: Remplacer le conditionnel avec le polymorphisme.
Disons que vous avez un morceau de logiciel qui est utilisé pour enregistrer les informations de différents dispositifs: 4 opérations de persistance sont définis: extraire, enregistrer, supprimer, mettre à jour, qui pourrait être mis en œuvre par le nombre N de mécanisme de persistance ( fichiers plats, réseau, SGBD, XML, etc ) .
Votre code à l'appui de tous dans 4 endroits différents, vous avez la ce:
AVANT
Même pour enregistrer/supprimer/mettre à jour
Et ainsi de suite....
Utilisez le commutateur/instruction de cas devient problématique:
Chaque fois que vous voulez ajouter un nouveau type, vous devez insérer le nouveau switch/case dans chaque section.
À de nombreuses reprises, certains types sont similaires, et ils n'ont pas besoin d'un autre switch/case ( vous pourriez cascade )
De sorte que le refactoring ici serait d'ajouter une interface ou un type abstrait et les différents types d'implémenter cette interface, et en déléguer la responsabilité à cet objet.
De sorte que vous auriez quelque chose comme ceci:
APRÈS
Et les différentes implémentations
Et les autres types permettrait de mettre en œuvre en fonction de leur logique. Réseau de traiter avec les sockets et les ruisseaux, les DB de traiter avec JDBC, jeux de résultats etc. XML avec nœud etc.etc.
Et, enfin, vous avez juste à déléguer les invocations.
Plus tard:
Donc, vous avez juste à créer l'instance appropriée pour le gestionnaire de persistance en fonction du type qu'une seule fois. Ensuite, tous les appels sont résolus par le polymorphisme. C'est l'une des principales caractéristiques de la Technologie Orientée Objet.
Si vous décidez que vous avez besoin d'un autre gestionnaire de persistance, il vous suffit de créer la nouvelle de la mise en œuvre et affectés à la classe.
OriginalL'auteur OscarRyz
La refactorisation de votre code pour utiliser le polymorphisme pourrait se débarrasser de la nécessité d'une instruction switch. Cependant, il y a quelques utilisations légitimes de l'interrupteur donc, cela dépend de votre situation.
Lien sympa. Regarde comme il y a beaucoup de bons dans le catalogue.
OriginalL'auteur Taylor Leese
une vilaine série de
if,else if,else
?OriginalL'auteur Pierre
ou on pourrait imaginer une sorte de dynamique de l'interrupteur de cas:
OriginalL'auteur Pierre
Je suppose que "Code Propre" a un beau chapitre selon switch/case vs si/d'autre.
D'ailleurs: je pense qu'il est judicieux de décider si vous pouvez réduire le "bruit" et rendre le code plus propre en utilisant l'interrupteur cas, le polymorphisme ou même un bon ol' si/d'autre. Le nombre de cas joue un rôle majeur ici, je suppose.
OriginalL'auteur gia
Je poste un cas typique comment j'ai remplacé l'interrupteur cas avec le protocole enum.
avant de refactoriser j'ai enum
PatternTypes
:et de la fonction:
Après refactoriser
PatternTypes
modifié:et de la fonction de simplifier:
OriginalL'auteur Jerry Zhang
Hashmap est considéré comme n'ayant pas de mémoire conviviale, de sorte que vous pouvez utiliser Enum pour ce but.
Exemple:
Ce sera l'organe de vous, de l'écriture Commutateur Cas ou si des instructions.
OriginalL'auteur ksinghit
Pour un remplaçant pour le switch, je pense que la meilleure solution sera d'utiliser un enum. Par exemple: prenons le cas ci-dessous:-
Ci-dessus enum peut être utilisé de la manière suivante:
J'espère que cela vous aide à vous les gars.
OriginalL'auteur Jibandeep Bal
Que voulez-vous faire? Pourquoi n'est pas le Cas de Commutateur assez bon?
La rapide réponse est: utiliser des if-else
OriginalL'auteur Carlos Tasada
?
Mais je ne dirais pas que c'est mieux...
OriginalL'auteur
Un
if
(avecelse if
etelse
) déclaration? Alors queswitch
vous permettra seulement de commutateur à l'aide de l'égalité contre les entiers ou les types Enum,if
vous permet d'utiliser toute la logique booléenne.Oui, mais ils peuvent également être en toute sécurité (automatiquement) cast en int
OriginalL'auteur Adam Batkin
Vous pouvez toujours remplacer un interrupteur de
if-else if-else if-else if...
, mais je ne vois pas pourquoi vous voulez. Selon le contexteswitch
s peut aussi parfois être remplacés par des tableaux ou hashmaps.OriginalL'auteur sepp2k
Si les chaînes sont statiques, Vous pouvez faire un ENUM.
et faire un switch sur elle.
OriginalL'auteur Eyal