Java 映射两个相关的枚举?

Java 映射两个相关的枚举?,java,enums,Java,Enums,我有两个相关的枚举: 列举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_SERV

我有两个相关的枚举:

列举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(正常)与200(正常)有映射

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

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

ACCEPTED(1000, 202),
    OK(2000, 200)
因此,当我得到2000时,我将反向查找枚举以获得OK,然后调用getter以获得与2000相关的第二个值(200)


任何更好的方法???

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

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 enum中的代码是唯一的,您可以实现类似于
getBbyCode()
的方法,那么您也有
B.a

取决于您是想单向还是双向

一个简单的机制是在枚举中保存等价项,并在构造函数中指定它

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);
    // ...
}
static final Map protocolStatus=新的EnumMap(HttpStatusCode.class);
静态最终映射httpStatus=新的EnumMap(ProtocolStatusCode.class);
专用静态void等价物(HttpStatusCode http、ProtocolStatusCode协议){
protocolStatus.put(http,协议);
httpStatus.put(协议,http);
}
静止的{
等效(HttpStatusCode.ACCEPTED,ProtocolStatusCode.ACCEPTED);
等效(HttpStatusCode.OK、ProtocolStatusCode.OK);
// ...
}

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

协议状态代码2000(正常)与200(正常)有映射

这意味着在面向对象编程中需要一个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;
    }


}
当我在web上原始键入代码时,代码可能有拼写错误。:)