Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java枚举映射?_Java_Enums - Fatal编程技术网

Java枚举映射?

Java枚举映射?,java,enums,Java,Enums,我有两个枚举,它们之间有映射 列举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 getOperat

我有两个枚举,它们之间有映射

列举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
提供映射的一种方法是创建一个名为binder的第三个枚举:

枚举3:

CREATE(1, HttpMethodName.POST),
    RETRIEVE(2, HttpMethodName.GET),
    UPDATE(3, HttpMethodName.PUT),
    DELETE(4, HttpMethodName.DELETE),
    NOTIFY(5, HttpMethodName.POST);
另一种方法是只保留两个枚举,并修改枚举2本身以具有映射

哪种方法更好

我觉得在Approach 1中会有分离,虽然我觉得第三个枚举不是常量类型(这是枚举的主要用途),但它将是一个绑定器


一个警告是,随着代码的增长,可能会出现更多绑定。例如,对于另一种类型的协议,可能存在与
创建
等相关的第二个绑定。

我将向
协议操作
添加一个公共方法
getHttpMethod()
(该方法将处理映射),如下所示:

public enum ProtocolOperation {

    CREATE(1){
        @Override
        public HttpMethodName getHttpMethodName(){
            return HttpMethodName.POST; 
        }
    },
    RETRIEVE(2){
        @Override
        public HttpMethodName getHttpMethodName(){
            return HttpMethodName.GET;  
        }
    },
    UPDATE(3){
        @Override
        public HttpMethodName getHttpMethodName(){
            return HttpMethodName.PUT;  
        }
    },
    DELETE(4){
        @Override
        public HttpMethodName getHttpMethodName(){
            return HttpMethodName.DELETE;   
        }
    },
    NOTIFY(5){
        @Override
        public HttpMethodName getHttpMethodName(){
            return HttpMethodName.POST; 
        }
    };


    private BigInteger operationId;


    public BigInteger getOperationId() {
        return operationId;
    }

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

   abstract public HttpMethodName getHttpMethodName();
}

e、 g


如果可能的话,绑定可能会在将来增加,那么你应该把它看作一个实体。请详细解释一下这种可能的绑定。i、 e.CREATE将与什么绑定?使用方法添加绑定使您能够灵活地添加任何逻辑,请检查我的答案。@BilboBaggins:因此可能存在其他一些协议,其值可能与
CREATE
关联。例如:
CREATE(1,HttpMethodName.POST,SomeOtheProtocol.someu_NAME)
保留三个枚举、两个单独的类型和一个绑定不是一个好主意吗?所以如果有新的绑定出现(请查看我上面的评论),我将不得不为每个添加一个新方法?是的,这就是我们公司所做的。第一次看起来很整洁,但很快就会有回报。保留三个枚举、两个分离类型和一个活页夹不是一个好主意吗?为什么?这意味着一个协议枚举可以在d/t时间上采取不同的行动,这是向协议添加行为(方法)的明确场景
ProtocolOperation createProtocolOperation = ProtocolOperation.CREATE;
HttpMethodName createOpHttpMethodName = createProtocolOperation.getHttpMethodName();