9
votes

Deux mappage d'énums associés?

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 commentaires

É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 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?


3 Réponses :


1
votes

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 xxx pré>

et ici le corps de votre méthode de mappage (j'utilise JDK8): P>

 HttpMethodName(ProtocolOperation... ops) {
    this.ops = Collections.unmodifiableList(Arrays.asList(ops));
 }


2 commentaires

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 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.



8
votes

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;
    }
}


5 commentaires

Puisque op veut une carte de Protocolopération à httpmethodname , 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 à httpmethodname ? Juger de ses mots Les valeurs ENUMS ont la cartographie comme suit: et le tableau suivant, je suppose qu'il souhaite une carte à partir de httpmethodname à Protocolopération .


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.



4
votes

Créer le mappage de Protocolopération à httpmethodname Comme vous l'avez montré avec les flèches, elles sont donc de simples références, pas de liste.

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.

Vous suivez les mappages comme suit: xxx

implémentation: < / p> xxx


1 commentaires

Wow, j'ai posté la même solution que vous. Ce n'était pas intentionnel. Vous upvotant :)