两个相关的枚举映射? [英] Two related enums mapping?
问题描述
我有两个相关的枚举。
枚举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
因此,值之间存在一对一的映射,只有 POST
情况,根据情况可以有两个值 Create
或 Notify
。
So there is one to one mapping between values except only for POST
case which can have two values either Create
or Notify
based on a condition.
我正在考虑将映射保留为 List
:
I was thinking of keeping the mapping as List
:
public enum HttpMethodName
{
POST(new List(ProtocolOperation.CREATE, ProtocolOperation.NOTIFY)) ,GET ( new List(ProtocolOperation.RETRIEVE) ) ,
PUT (new List(ProtocolOperation.UPDATE) ,DELETE(new List(ProtocolOperation.DELETE) ;
List<ProtocolOperation > ops;
HttpMethodName (List<ProtocolOperation> ops)
{
this.ops = ops;
}
}
是否有更好的方法?
编辑:
我要从 HttpMethodName< ----> Proto映射双向 colOperation
I will want mapping both ways from HttpMethodName <----> ProtocolOperation
推荐答案
为什么您发现当前的方法不令人满意?
Why do you find your current approach unsatisfactory?
在不知道您担心的情况下,我只能建议删除样板:
Without the knowledge of your concerns I can only suggest to remove boilerplate:
import static ProtocolOperation.*;
public enum HttpMethodName {
GET(RETRIEVE),
POST(CREATE, NOTIFY),
PUT(UPDATE),
DELETE(ProtocolOperation.DELETE);
final List<ProtocolOperation> ops;
HttpMethodName(ProtocolOperation... ops) {
this.ops = Collections.unmodifiableList(Arrays.asList(ops));
}
}
UPD:
如果您想同时使用两种方式进行映射,则可以将硬编码从 ProtocolOperation
映射到 HttpMethodName
首先(因为它不需要列表),然后在 MttpMethodName
中创建一个简单的搜索方法:
UPD:
If you want to have mapping in both ways, it makes sense to hardcode mapping from ProtocolOperation
to HttpMethodName
first (as it doesn't require list) and create a simple search method in MttpMethodName
:
public enum ProtocolOperation {
CREATE(1, HttpMethodName.POST),
RETRIEVE(2, HttpMethodName.GET),
UPDATE(3, HttpMethodName.PUT),
DELETE(4, HttpMethodName.DELETE),
NOTIFY(5, HttpMethodName.POST);
private BigInteger operationId;
private HttpMethodName methodName;
public BigInteger getOperationId() {
return operationId;
}
public HttpMethodName getMethodName() {
return methodName;
}
private ProtocolOperation(int operationId, HttpMethodName httpMethodName) {
this.methodName = httpMethodName;
this.operationId = BigInteger.valueOf(operationId);
}
}
public enum HttpMethodName {
GET,
POST,
PUT,
DELETE;
List<ProtocolOperation> getProtocolOperations() {
List<ProtocolOperation> ops = new ArrayList<ProtocolOperation>(2);
for (ProtocolOperation op : ProtocolOperation.values()) {
if (op.getMethodName() == this) {
ops.add(op);
}
}
return ops;
}
}
由于值的数量恒定且数量少,因此您不需要在 HttpMethodName
中创建最终的静态映射来提供向后映射,线性搜索就足够适合您的情况了。
As you have constant and small number of values, you don't need to create final static map in HttpMethodName
to provide the backwards mapping, linear search is fast enough for your case.
这篇关于两个相关的枚举映射?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!