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语句并添加所有可能的代码并返回适当的常量.但我想避免在两个地方同时定义它们.
如果你有很多,你可以使用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),这将非常有用.
| 归档时间: |
|
| 查看次数: |
1208 次 |
| 最近记录: |