【问题标题】:Map two related enums?映射两个相关的枚举?
【发布时间】:2015-09-18 09:18:53
【问题描述】:

我有两个相关的枚举:

枚举1:

public enum HttpStatusCode {

    ACCEPTED(202),
    OK(200),
    CREATED(201),
    BAD_REQUEST(400),
    NOT_FOUND(404),
    METHOD_NOT_ALLOWED(405),
    REQUEST_TIMEOUT (408),
    FORBIDDEN(403),
    CONFLICT(409),
    INTERNAL_SERVER_ERROR(500),
    NOT_IMPLEMENTED(501);

    private int httpStatusCode;

    private HttpStatusCode(int name) {
        this.httpStatusCode = name;
    }

    public int getHttpStatusCode() {
        return httpStatusCode;
    }
}

枚举2:

public enum ProtocolStatusCode {

    ACCEPTED(1000),
    OK(2000),
    CREATED(2001),
    BAD_REQUEST(4000)

private int protocolStatusCode;

    private ProtocolStatusCode(int protocolStatusCode) {
        this.protocolStatusCode = protocolStatusCode;
    }

    public int getStatusCode() {
        return protocolStatusCode;
    }
}

这两个枚举值在一个映射中是相关的,例如

协议状态码 2000(OK)与 200(OK)有映射关系。

因此,在我的代码中,我将获得 ProtocolStatusCode (2000),并且与此相对应,我需要 HttpStatusCode (200)。

我正在考虑将 ProtocolStatusCode 枚举维护为

ACCEPTED(1000, 202),
    OK(2000, 200)

所以当我得到 2000 时,我会反向查找枚举以获取 OK,然后调用 getter 来获取与 2000 相关的第二个值(200)。

有更好的方法吗??

【问题讨论】:

    标签: java enums


    【解决方案1】:

    您可以在第二个枚举中添加一个字段,这是第一个枚举的类型。然后你不必搜索第一个枚举数组来找到正确的对象。比如:

    enum A{
        A_FOO(1),
        A_BAR(2);
        private  int code;
    
        private A(int code) {
            this.code = code;
        }
    
        public int getCode() {
            return code;
        }
    }
    
    enum B{
        B_FOO(1000,A_FOO),
        B_BAR(2000,A_BAR);
    
        private int code;
        private A status;
    
        private B(int code, A status) {
            this.code = code;
            this.status = status;
        }
    
        public int getCode() {
            return code;
        }
    
        public A getStatus() {
            return status;
        }
    }
    

    因此,如果 B 枚举中的代码是唯一的,您可以实现类似 getBbyCode() 的方法,那么您也有 B.A。

    【讨论】:

      【解决方案2】:

      取决于你是想单向还是双向。

      一种简单的机制是在枚举中保存等价物并在构造函数中指定它。

      public enum HttpStatusCode {
      
          ACCEPTED(202, ProtocolStatusCode.ACCEPTED),
          OK(200, ProtocolStatusCode.OK),
          CREATED(201,ProtocolStatusCode.CREATED);
      
          private int httpStatusCode;
          private final ProtocolStatusCode protocolEquivalent;
      
          private HttpStatusCode(int name, ProtocolStatusCode protocolEquivalent) {
              this.httpStatusCode = name;
              this.protocolEquivalent = protocolEquivalent;
          }
      
          public int getHttpStatusCode() {
              return httpStatusCode;
          }
      }
      

      或者 - 您可以构建两个地图:

      static final Map<HttpStatusCode, ProtocolStatusCode> protocolStatus = new EnumMap(HttpStatusCode.class);
      static final Map<ProtocolStatusCode, HttpStatusCode> httpStatus = new EnumMap(ProtocolStatusCode.class);
      
      private static void equivalent(HttpStatusCode http, ProtocolStatusCode protocol) {
          protocolStatus.put(http, protocol);
          httpStatus.put(protocol, http);
      }
      
      static {
          equivalent(HttpStatusCode.ACCEPTED, ProtocolStatusCode.ACCEPTED);
          equivalent(HttpStatusCode.OK, ProtocolStatusCode.OK);
          // ...
      }
      

      【讨论】:

        【解决方案3】:

        您对程序的逻辑符合您的要求。

        协议状态码 2000(OK)与 200(OK)有映射关系。

        这意味着你在面向对象编程中需要一个has-a关系。

        public enum ProtocolStatusCode {
        
        
            OK(2000, HttpStatusCode.OK);//so goes others
        
        
            private int protocolStatusCode;
            private HttpStatusCode httpStatusCode;
        
            private ProtocolStatusCode(int protocolStatusCode, 
                                       HttpStatusCode httpStatusCode) {
                this.protocolStatusCode = protocolStatusCode;
                this.httpStatusCode = httpStatusCode;
            }
        
            public HttpStatusCode getHttpStatusCode(){//new
                return this.httpStatusCode;
            }
        
            public int getHttpStatusCodeVal(){//new method for lookup
                return this.getHttpStatusCode().getHttpStatusCode();
            }
        
            public int getStatusCode() {
                return protocolStatusCode;
            }
        
        
        }
        

        当我在网络上输入原始代码时,代码可能有拼写错误。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-20
          • 2021-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-14
          • 2017-03-03
          • 1970-01-01
          相关资源
          最近更新 更多