java - 枚举帮助/建议 - java

标签 java enums

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

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

相关文章:

java - "Object"不是这个 Realm 的架构的一部分

c++ - 运算符为枚举重载

java - 接受任何枚举并返回所有属性的方法

c++ - 从枚举类型到 int 的隐式转换如何可能?

c++ - 我怎样才能部分特化所有枚举的类模板?

java - COMM API安装错误: nblibraries.属性文件不存在

java - 如何在 JDBC 数据源级别限制从 Oracle 返回的行数?

java - 无法在 Spring Controller 中接收对象

java - 为什么传递返回变量但也有 println 的参数也会传递 println?

c# - Enum 上的扩展方法 - 无法公开 Enum 本身的方法