【问题标题】:Java enums mapping?Java枚举映射?
【发布时间】:2015-10-15 07:10:17
【问题描述】:

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

枚举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);

另一种方法是只保留两个枚举并修改 Enum2 本身以进行映射。

哪种方法会更好??

我觉得在方法1中会有分离,虽然我觉得第三个枚举不是一个常量类型(这是枚举的主要目的),它将是一个活页夹。

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

【问题讨论】:

  • 如果将来可能的绑定可能会增加,那么您应该将其视为一个实体。请详细解释一下这种可能的绑定。即 CREATE 将与什么绑定?
  • 使用方法添加绑定可以让您灵活地稍后添加任何逻辑,请查看我的答案。
  • @BilboBaggins:所以可能有一些其他协议的值可能与CREATE 相关联。例如:CREATE(1, HttpMethodName.POST, SomeOtheProtocol.SOME_NAME)
  • 保留三个枚举、两个单独的类型和一个活页夹不是一个好主意吗?

标签: java enums


【解决方案1】:

我将向ProtocolOperation 添加一个公共方法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();
}

例如

ProtocolOperation createProtocolOperation = ProtocolOperation.CREATE;
HttpMethodName createOpHttpMethodName = createProtocolOperation.getHttpMethodName();

【讨论】:

  • 所以如果有新的绑定出现(请查看我上面的评论),我将不得不为每个绑定添加一个新方法?
  • 是的,这就是我们在我公司所做的。第一次看起来很整洁,但很快就会有回报。
  • 保留三个枚举、两个单独的类型和一个活页夹不是一个好主意吗?
  • 为什么?这意味着一个协议枚举可以在 d/t 时间采取不同的行动,这是向协议添加行为(方法)的明确方案
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2011-04-14
  • 2017-03-03
  • 1970-01-01
相关资源
最近更新 更多