Java 映射两个相关的枚举?
我有两个相关的枚举: 列举1: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
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上原始键入代码时,代码可能有拼写错误。:)