Comment convertir un enum pour un autre enum en java?
J'ai;
public enum Detailed {
PASSED, INPROCESS, ERROR1, ERROR2, ERROR3;
}
et le besoin de les convertir à la suivante;
public enum Simple {
DONE, RUNNING, ERROR;
}
Donc d'abord PASSED
->DONE
et INPROCESS
->RUNNING
, mais toutes les erreurs doivent être: ERROR
. Évidemment, il est possible d'écrire des cas pour toutes les valeurs, mais il y a peut être une meilleure solution?
Vous devez vous connecter pour publier un commentaire.
Une façon est de définir une méthode
asSimple()
dans votreDetailed
enum:Vous pouvez ensuite il suffit d'appeler la méthode lorsque vous souhaitez faire la cartographie:
Il a l'avantage de mettre la connaissance de la cartographie avec le
Detailed
enum (où peut-être il appartient). Elle a l'inconvénient d'avoir des connaissances deSimple
mélangé avec le code pourDetailed
. Cela peut ou peut ne pas être une mauvaise chose, selon votre architecture du système.Detailed
finirait exiger la connaissance de l'Simple
. (En gros, j'ai été en exprimant la même préoccupation que vous avez fait dans votre commentaire, mais plutôt vague critique de l'appeler un "désavantage". Vous étiez beaucoup plus précis.) Néanmoins, je pense que cette approche est utile d'examiner. OP enum noms suggère queDetailed
est conceptuellement un raffinement deSimple
. Si c'est le cas, alors ce n'est pas une mauvaise chose queDetailed
est couplé àSimple
(bien que ce n'est pas toujours une mauvaise chose qu'une sous-classe est couplé à sa classe parente).Personnellement, je voudrais juste créer un
Map<Detailed, Simple>
et de le faire de manière explicite - ou même utiliser unswitch
déclaration, potentiellement.Une autre solution serait de passer le mappage dans le constructeur, vous ne pouviez faire un tour, bien sûr:
(Je trouve cela plus simple que de Ted approche de l'utilisation du polymorphisme, comme nous ne sommes pas vraiment en essayant de fournir différents comportement - juste une autre cartographie simple.)
Pendant que vous pourrait - être de faire quelque chose de ruse avec la valeur ordinale, il serait beaucoup moins évidente, et de prendre plus de code, je ne pense pas qu'il y aurait tout avantage.
Utilisation EnumMap
Je découpler mon xml externe de l'interface à partir de l'intérieur de ma modèle de domaine par la mise en œuvre d'un service de transformation. Cela inclut la cartographie des énumérations de jaxb code généré pour modèle de domaine enum.
À l'aide d'un statique EnumMap encapsule le souci de la transformation au sein de la classe responsable de la transformation. Sa cohésion.
Ted réponse est très Javaly, mais l'expression
pour faire le travail, aussi.
PASSED ? DONE : INPROCESS ? RUNNING : ERROR
depuis qui est, évidemment, moins lisible. (Là encore, j'ai vu qu'avant, et avec une bonne mise en forme, il n'a pas l'air de trop étrange...)Pour moi, cela sonne plus comme un problème conceptuel que d'un problème de programmation. Pourquoi ne pas vous venez de supprimer la "Simple" d'un type enum et utiliser l'autre au lieu de cela, dans tous les endroits dans le programme?
Juste pour faire plus clair avec un autre exemple: voulez-vous vraiment essayer de définir un type enum pour les jours de travail dans une semaine (du lundi au vendredi) et un autre enum pour tous les jours de la semaine (lundi au dimanche)?
enum
types de ne peut pas hériter d'autresenum
types en Java, vous êtes un peu coincé avec ce genre de cartographie de temps à autre.Voici le simple enum mapper avec test:
-- Mise en ŒUVRE
-- ENUMS
--MAPPEUR
-- TEST
Goyave est
Enums.getIfPresent()
surEnum.name()
Notre cas était une spécialisation particulière de celui-ci. Nous avons deux
Enum
: celui que nous utilisons dans l'application et un autre que nous utilisons dans la bibliothèque de base. La bibliothèque de base est utilisé par une poignée d'applications, par les différentes équipes. Chaque candidature en vue d'un sous-ensemble de l'ensemble des fonctionnalités. L'ensemble des fonctionnalités est configuré avec l'option pour basculer entre on et off, manette des gaz vers le haut ou vers le bas, sélectionnez stratégies, etc.Nous avons donc fini avec:
Puis, comme nous transmettre des données à la bibliothèque, nous adaptons toutes les données et les configurations. Nous possédons toutes les énumérations, de sorte que nous pouvons choisir d'appeler la même configuration avec le même littéral dans différentes énumérations.
Quand nous en avons besoin pour le convertir en un autre type (app --> lib ou lib --> app), nous utilisons la
getIfPresent()
méthode decom.google.common.base.Enums
de cette façon:Nous vérifions
configLib
pournull
valeur pour voir si il y a la réussite de la conversion. Cette dernière étape nous utilisons en raison de la APPX_FUNCTION_YYY, qui sont spécifiques à l'application, et pour la conversion de la direction lib --> app, de ne pas transmettre les valeurs de configuration spécifiques aux bibliothèques (FUNCTION_FOUR
dans l'exemple).maven de la gestion de la dépendance:
Juste au cas où quelqu'un en a besoin:
Cultivés à la maison version:
Vous pouvez faire votre propre conversion à l'aide de l'énumération des méthodes, mais vous devez prendre soin de l'exception de détecter si la conversion n'a pas réussi: