两个相关的枚举映射? [英] Two related enums mapping?

查看:254
本文介绍了两个相关的枚举映射?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个相关的枚举。

枚举1:

public enum HttpMethodName 
{
    GET, POST, PUT, DELETE; 
}

枚举2:

public enum ProtocolOperation {
    CREATE(1), RETRIEVE(2), UPDATE(3), DELETE(4), NOTIFY(5);


    private BigInteger operationId;

    public BigInteger getOperationId() {
        return operationId;
    }

    private ProtocolOperation(int operationId) {
        this.operationId = BigInteger.valueOf(operationId);
    }
}

枚举值的映射为:

Create--> POST
Retrieve--> GET
Update--> PUT
Delete--> DELETE
Notify---> POST

因此,值之间存在一对一的映射,只有 POST 情况,根据情况可以有两个值 Create Notify

So there is one to one mapping between values except only for POST case which can have two values either Create or Notify based on a condition.

我正在考虑将映射保留为 List

I was thinking of keeping the mapping as List:

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

是否有更好的方法?

编辑:

我要从 HttpMethodName< ----> Proto映射双向 colOperation

I will want mapping both ways from HttpMethodName <----> ProtocolOperation

推荐答案

为什么您发现当前的方法不令人满意?

Why do you find your current approach unsatisfactory?

在不知道您担心的情况下,我只能建议删除样板:

Without the knowledge of your concerns I can only suggest to remove boilerplate:

import static ProtocolOperation.*;

public enum HttpMethodName {
    GET(RETRIEVE),
    POST(CREATE, NOTIFY),
    PUT(UPDATE),
    DELETE(ProtocolOperation.DELETE);

    final List<ProtocolOperation> ops;

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



UPD:



如果您想同时使用两种方式进行映射,则可以将硬编码从 ProtocolOperation 映射到 HttpMethodName 首先(因为它不需要列表),然后在 MttpMethodName 中创建一个简单的搜索方法:

UPD:

If you want to have mapping in both ways, it makes sense to hardcode mapping from ProtocolOperation to HttpMethodName first (as it doesn't require list) and create a simple search method in MttpMethodName:

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

由于值的数量恒定且数量少,因此您不需要在 HttpMethodName 中创建最终的静态映射来提供向后映射,线性搜索就足够适合您的情况了。

As you have constant and small number of values, you don't need to create final static map in HttpMethodName to provide the backwards mapping, linear search is fast enough for your case.

这篇关于两个相关的枚举映射?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆