从唯一的实例值中创建枚举工厂方法

Max*_*han 5 java enums factory

我创建了一个Enum来定义某些动作.针对外部API编程我被迫Integer用来表达这个动作.这就是为什么我在我的Enum中添加了一个整数实例字段.这应该与Joshua Bloch的Effective Java一致,而不是依赖于ordinal()Enum常量使用的顺序values()[index].

public enum Action {

    START(0),

    QUIT(1);

    public final int code;

    Protocol(int code) {
         this.code = code;
     }
}
Run Code Online (Sandbox Code Playgroud)

what从API 获得一个整数值,现在我想从中创建一个Enum值,我该如何以最通用的方式实现它?

显然,添加这样的工厂方法是行不通的.您无法实例化枚举.

Action valueOf(int what) {
     return new Action(what);
}
Run Code Online (Sandbox Code Playgroud)

当然,我总是可以创建一个switch-case语句并添加所有可能的代码并返回适当的常量.但我想避免在两个地方同时定义它们.

Bri*_*ian 5

如果你有很多,你可以使用HashMap<Integer, Action>:

private static final Map<Integer, Action> actions = new HashMap<>(values().size, 1);

static {
    for (Action action : values())
        actions.put(action.code, action);
}

// ...

public static Action valueOf(int what) {
    return actions.get(what);
}
Run Code Online (Sandbox Code Playgroud)

如果您将拥有大量Action值,因为HashMap查找为O(1),这将非常有用.