以下情况是否可以使用枚举:
假设您有一定数量的预定义“读取类型”。示例读取类型可以是:诊断、KWH、MaxDemand、OnPeak 等。对于每种读取类型,都有一个“TIMTagNumber”,它本质上是用于检索每个预定义读取类型的协议(protocol)。
例如,TIMTagNumber 1100 将检索读取类型诊断 TIMTagNumber 1300 将检索读取类型 KWH。 问题是预定义的读取类型有时可以由多个 TIMTagNumber 检索。
我想创建一个枚举 ReadType 来定义每个读取类型以及可用于检索该读取的所有 TIMTagNumber。 可以这样使用枚举吗?
public enum ReadType{
KWH(1300)
Diagnostic(1100)
ReadType3(1400, 1401) // This read can be retrieved by both 1400 and 1401
}
如果枚举不是可行的方法,是否有一种优雅或有效的方法来定义这些读取类型?所有这一切的总体预期结果本质上是根据 TIMTagNumbers 识别读取的类型。
即给出 1400 或 1401,您就会知道它是“ReadType3”。
最佳答案
你能做到吗?是的。这是否是正确的决定取决于您是否要将这些 TIMTagNumbers 与读取类型耦合。如果没有,一个简单的 Map<Integer, ReadType>
可能就足够了。
具体操作方法如下:
public static enum MyEnum {
KWH(1300),
Diagnostic(1100),
ReadType3(1400, 1401);
private Set<Integer> timTagNumbers;
MyEnum(Integer... timTagNumbers) {
this.timTagNumbers = new HashSet<Integer>(Arrays.asList(timTagNumbers));
//add check to make sure that values are unique across all instances
}
public static MyEnum forTIMTagNumber(int num) {
for ( MyEnum readType : values() ) {
if ( readType.timTagNumbers.contains(num) ) {
return readType;
}
}
throw new NoSuchElementException("No ReadType matching TIMTagNumber " + num);
}
}
//...
int timTagNumber = 1400;
ReadType readType = ReadType.forTIMTagNumber(timTagNumber);
正如我上面所说,当数据和枚举类型已经本质上耦合时,这种样式效果很好。当枚举类型与映射值分离时(例如,这些值用于序列化枚举的多种方法之一),或者这些值是特定于配置的甚至是动态的(例如,如果它们是价格),那么这将不好。一个元素)。在这些情况下,通常最好将此映射外部化为 EnumMap
或Map
.
关于java - 枚举帮助/建议 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9742399/