J'ai deux énumes qui sont liées.
ENUM1: P>
public enum HttpMethodName { POST(new List(ProtocolOperation.CREATE, ProtocolOperation.NOTIFY)) ,GET ( new List(ProtocolOperation.RETRIEVE) ) , PUT (new List(ProtocolOperation.UPDATE) ,DELETE(new List(ProtocolOperation.DELETE) ; List<ProtocolOperation > ops; HttpMethodName (List<ProtocolOperation> ops) { this.ops = ops; } }
3 Réponses :
J'irais avec la logique séparant de l'énum. Votre approche est un couplage étroit, moins élastique. Avec une telle bibliothèque avec transformation métod, vous êtes plus flexible et ici le corps de votre méthode de mappage (j'utilise JDK8): P> HttpMethodName(ProtocolOperation... ops) {
this.ops = Collections.unmodifiableList(Arrays.asList(ops));
}
Pourquoi êtes-vous une chose que Enum ne doit pas contenir de cartographie? Pour moi, la relation entre les méthodes HTTP et leurs rôles est définie dans la pierre par protocole HTTP. Vous auriez raison s'il y en avait plusieurs (disons, plus de deux) mappages différents impliquant httpmethodname code> Enum, mais je trouve que cela sera improbable.
Quelques années plus tard, je faisais la même approche. Dans cet exemple, cela peut avoir la sens, mais nous avons généralement tendance à garder le code ouvert pour des extensions. Avoir des mappages dans une classe d'utilité nous permettra de créer des mappages distincts pour d'autres clients / modules, etc. Mais je dois admettre que dans cet exemple, gardez la liste d'insectes d'énums d'une énumération peut être bonne.
Pourquoi trouvez-vous votre approche actuelle insatisfaisante?
Sans la connaissance de vos préoccupations, je ne peux que suggérer de supprimer la chaudras: P>
public enum ProtocolOperation { CREATE(1, HttpMethodName.POST), RETRIEVE(2, HttpMethodName.GET), UPDATE(3, HttpMethodName.PUT), DELETE(4, HttpMethodName.DELETE), NOTIFY(5, HttpMethodName.POST); private BigInteger operationId; private HttpMethodName methodName; public BigInteger getOperationId() { return operationId; } public HttpMethodName getMethodName() { return methodName; } private ProtocolOperation(int operationId, HttpMethodName httpMethodName) { this.methodName = httpMethodName; this.operationId = BigInteger.valueOf(operationId); } } public enum HttpMethodName { GET, POST, PUT, DELETE; List<ProtocolOperation> getProtocolOperations() { List<ProtocolOperation> ops = new ArrayList<ProtocolOperation>(2); for (ProtocolOperation op : ProtocolOperation.values()) { if (op.getMethodName() == this) { ops.add(op); } } return ops; } }
Puisque op veut une carte de Protocolopération code> à
httpmethodname code>, vous auriez dû faire l'inverse, ce qui éliminerait également la nécessité d'une liste.
@Andreas: cela conduirait à itération de valeurs d'énorme à chaque fois pour trouver la cartographie ??
@Andreas, qu'est-ce qui vous fait penser que OP souhaite mapper de Protocolopération code> à
httpmethodname code>? Juger de ses mots
Les valeurs ENUMS ont la cartographie comme suit: CODE> et le tableau suivant, je suppose qu'il souhaite une carte à partir de
httpmethodname code> à
Protocolopération code>.
Je voudrais une cartographie des deux côtés. Je modifie la question
@Siddharthtrikha J'ai mis à jour ma réponse pour couvrir la cartographie des deux sens.
Créer le mappage de La cartographie inverse peut alors être une Méthode statique qui comporte les 5 valeurs d'énumération pour les matchs. Il n'y a que 5 valeurs, donc une recherche séquentielle est suffisamment rapide, à moins que ce soit quelque chose que vous faites dans une boucle très serrée, et c'est peu probable dans ce cas. En outre, vous ne devriez pas coder pour la performance tant qu'un profileur ne dit que vous avez un problème. P> Vous suivez les mappages comme suit: p> implémentation: < / p> Protocolopération code> à
httpmethodname code> Comme vous l'avez montré avec les flèches, elles sont donc de simples références, pas de liste.
Wow, j'ai posté la même solution que vous. Ce n'était pas intentionnel. Vous upvotant :)
Était-ce la dernière modification pour faire le mot "à la fois" audacieux, une réaction à ma réponse? Parce que ma réponse a la cartographie dans les deux sens.
l'utilisation peut utiliser bimap dans GUAVA
Vous attendez-vous à avoir deux
cartographier code> ou sont les réponses existantes recommandant des méthodes assez bonnes? Peut-être pouvez-vous également partager comment cette relation sera-t-elle utilisée davantage dans votre codeBase?