我使用以下代码创建了一个枚举:
public enum Operation {
a('0'), b('1');
}
之后我有字节 0 或 1。
现在我需要这个枚举中的一个静态类来从一个字节中获取适当的枚举:
public static Operation fromValue(byte value){ ...}
我怎么能做到这一点?
除了像 aix 那样对开关进行硬编码之外,您还可以选择自动变体以确保一切保持同步。显然我们可以通过创建一个来优化它HashMap<Byte, Operation>
(你可以在一个静态块或单个构造函数中初始化它)但是对于你通常的枚举应该做以下事情:
public static Operation fromValue(byte b) {
for (Operation op : values()) {
if (op.b == b) return op;
}
throw new IllegalArgumentException();
}
像这样的东西?
public static Operation fromValue(byte value) {
switch (value) {
case 0: return Operation.a;
case 1: return Operation.b;
default: throw new IllegalArgumentException();
}
}
您可以在包含相反映射的枚举中定义一个静态字段:
static Hashtable<byte, Operation> byteToOperation = new Hashtable<byte, Operation>();
并将枚举的构造函数更改为byteToOperation.put(byteValue, this)
然后在您的枚举中创建一个静态函数以从此映射中获取操作:
public static Operation fromValue(byte value) {
return byteToOperation.get(value);
}
那样:
Operation.fromValue('0'); //returns Operation.a
Operation.fromValue('1'); //returns Operation.b
并且每次在枚举中添加元素时,它都会自动添加到地图中。