我不确定我想要的是否可行,但我试图创建一个枚举,其中每个成员都有自己的内部类。这些内部类将全部具有相同的名称Context
,但将分别实现。
理想情况下,我希望它们可以这样使用:
private handleType (MyEnum type) {
switch (type) {
case ENUM_VAL1:
MyEnum.ENUM_VAL1.Context context = new MyEnum.ENUM_VAL1.Context();
handleContext1(context);
break;
case ENUM_VAL2:
MyEnum.ENUM_VAL2.Context context = new MyEnum.ENUM_VAL1.Context();
handleContext2(context);
break;
case ENUM_VAL3:
MyEnum.ENUM_VAL3.Context context = new MyEnum.ENUM_VAL1.Context();
handleContext3(context);
break;
default:
break;
}
开放其他实现方式。但基本上我需要一个可切换的枚举类型,其中每个成员都有一个“值”(1、2、3…),并且还有一种将该枚举类型与具有构造函数的唯一类相关联的方法。
编辑:一些背景信息。这将在两个通过JSON HTTP请求通信的服务之间使用。请求将包含一些元数据,其中一个字段是映射到该枚举类型的整数。上下文是一个POJO,但对于每个ENUM_VALUE都不同。基本上,上下文将被构建并序列化为JSON。这个JSON实际上只是顶层JSON请求中称为上下文的字符串字段。在接收服务上,将会有一个ENUM_VALUE开关,其中上下文会被适当解码,然后分派到其适当的处理程序。
编辑2:这个枚举类型将在两个服务之间共享。
编辑3:以下是我尝试做的事情更详细的说明。
MyServiceRequest:
public class MyServiceRequest {
String meta1;
String meta2;
int typeID;
String context;
}
生成请求:
MyServiceRequest req = new MyServiceRequest();
req.meta1 = ...
req.meta2 = ...
req.typeID = MyEnum.ENUM_VALUE.getCode(); // int
MyEnum.ENUM_VALUE.Context context = new MyEnum.ENUM_VALUE.Context(); // factory would be fine as well
... // populate context
req.context = toJSON(context);
requestJSON = toJSON(req);
post(requestJSON);
解码请求:
MyServiceRequest req = ...
MyEnum type = new MyEnum(req.typeID);
switch(type) {
case ENUM_VALUE:
MyEnum.ENUM_VALUE.Context context = fromJSON(req.context, MyEnum.ENUM_VALUE.Context.class);
doSomething(context);
Context
实现都有一个方法听起来像是一个糟糕的设计。我会将Context
作为接口或抽象类,并让每个子类实现它添加具体行为(即多态性)。然后,您只需要一个handleContext
方法。 - fps