枚举的每个成员的内部类?

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)

Sea*_*oyd 9

一个人认为你可以做的就是拥有你的枚举工具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)