两个相关的枚举映射?

Sid*_*kha 9 java enums

我有两个相关的枚举.

Enum1:

public enum HttpMethodName 
{
    GET, POST, PUT, DELETE; 
}
Run Code Online (Sandbox Code Playgroud)

Enum2:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

枚举值的映射为:

Create--> POST
Retrieve--> GET
Update--> PUT
Delete--> DELETE
Notify---> POST
Run Code Online (Sandbox Code Playgroud)

因此,值之间存在一对一的映射,除了仅POST可以具有两个值CreateNotify基于条件的情况.

我在考虑将映射保持为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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

还有更好的方法吗?

编辑:

我想要从两个方向映射HttpMethodName <----> ProtocolOperation

Aiv*_*ean 8

为什么你发现你目前的方法不令人满意?

如果不了解您的顾虑,我只能建议删除样板:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

UPD:

如果您希望以两种方式进行映射,则将映射从第一个硬编码ProtocolOperationHttpMethodName第一个(因为它不需要列表)是有意义的,并在以下位置创建一个简单的搜索方法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;
    }
}
Run Code Online (Sandbox Code Playgroud)

由于您具有常量和少量值,因此无需创建最终静态映射HttpMethodName以提供向后映射,线性搜索对于您的情况来说足够快.