gpt4 book ai didi

java - 枚举帮助/建议 - java

转载 作者:行者123 更新时间:2023-12-02 16:58:23 25 4
gpt4 key购买 nike

以下情况是否可以使用枚举:

假设您有一定数量的预定义“读取类型”。示例读取类型可以是:诊断、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);

正如我上面所说,当数据和枚举类型已经本质上耦合时,这种样式效果很好。当枚举类型与映射值分离时(例如,这些值用于序列化枚举的多种方法之一),或者这些值是特定于配置的甚至是动态的(例如,如果它们是价格),那么这将不好。一个元素)。在这些情况下,通常最好将此映射外部化为 EnumMapMap .

关于java - 枚举帮助/建议 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9742399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com