我有两个相关的枚举.
Enum1:
public enum HttpMethodName
{
GET, POST, PUT, DELETE;
}
Run Code Online (Sandbox Code Playgroud)
Enum2:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
枚举值的映射为:
Create--> POST
Retrieve--> GET
Update--> PUT
Delete--> DELETE
Notify---> POST
Run Code Online (Sandbox Code Playgroud)
因此,值之间存在一对一的映射,除了仅POST可以具有两个值Create或Notify基于条件的情况.
我在考虑将映射保持为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;
}
}
Run Code Online (Sandbox Code Playgroud)
还有更好的方法吗?
编辑:
我想要从两个方向映射HttpMethodName <----> ProtocolOperation
为什么你发现你目前的方法不令人满意?
如果不了解您的顾虑,我只能建议删除样板:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
如果您希望以两种方式进行映射,则将映射从第一个硬编码ProtocolOperation到HttpMethodName第一个(因为它不需要列表)是有意义的,并在以下位置创建一个简单的搜索方法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;
}
}
Run Code Online (Sandbox Code Playgroud)
由于您具有常量和少量值,因此无需创建最终静态映射HttpMethodName以提供向后映射,线性搜索对于您的情况来说足够快.