the*_*d47 8 java enums abstract-class
不确定我想要的是否可能,但我正在尝试创建一个枚举,其中每个成员都有自己的内部类.这些内部类将具有相同的名称,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;
}
Run Code Online (Sandbox Code Playgroud)
打开其他实现方式.但基本上我需要一个可切换的枚举,其中每个成员都有一个"值"(1,2,3 ...),还有一种方法可以将所述枚举与一个带有构造函数的唯一类相关联.
编辑:一些背景.这将在通过JSON http请求进行通信的两个服务之间使用.请求将包含一些元数据,其中一个字段是映射到枚举的整数.上下文是POJO,但每个ENUM_VALUE都不同.本质上,上下文将被构造并序列化为JSON.这个json实际上只是一个在顶级json请求中称为上下文的String字段.在接收服务上,将在ENUM_VALUE上进行切换,其中上下文被适当地解码,然后被分派到其适当的处理程序.
EDIT2:这个枚举将在两个服务之间共享.
编辑3:这是对我试图做的更明确的解释.
MyServiceRequest:
public class MyServiceRequest {
String meta1;
String meta2;
int typeID;
String context;
}
Run Code Online (Sandbox Code Playgroud)
生成请求:
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);
Run Code Online (Sandbox Code Playgroud)
解码请求:
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);
Run Code Online (Sandbox Code Playgroud)
一个人认为你可以做的就是拥有你的枚举工具Supplier<Context>.现在每个项都必须声明一个get()方法来创建单独的Context子类型.
enum MyEnum implements Supplier<Context>{
FOO{ @Override public Context get(){ return new FooContext(); } },
BAR{ @Override public Context get(){ return new BarContext(); } }
}
Run Code Online (Sandbox Code Playgroud)
这将使您的客户端代码更简单:
private void handleType (MyEnum type) {
handleContext(type.get());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
764 次 |
| 最近记录: |