java - 如何避免 java 中的重复枚举值?

标签 java enums

我有对应于编码的枚举。我需要检查枚举没有重复的编码数值。

public enum EncodingsEnum
{

ISO8859_1("ISO-8859-1",0), ISO8859_2("ISO-8859-2",1),
    ISO8859_3("ISO-8859-3",2), ISO8859_4("ISO-8859-4",3),
    ISO8859_5("ISO-8859-5",4), ISO8859_6("ISO-8859-6",5),
    ISO8859_7("ISO-8859-7",6), ISO8859_8("ISO-8859-8",7),
    ISO8859_9("ISO-8859-9",8), ISO8859_11("ISO-8859-11",9),
    ISO8859_13("ISO-8859-13",10),ISO8859_15("ISO-8859-15",11),
    UTF_8("UTF-8",11);

    public static final int ENCODINGS_COUNT = EncodingsEnum.values().length;
    private final String encodingName;
    private final int encodingNumber;

    EncodingsEnum(final String encodingName,int encodingNumber)
    {
        ReferenceChecker.checkReferenceNotNull(encodingName);

        this.encodingName = encodingName;
        this.encodingNumber = encodingNumber;
    }

    public static String getEncodingNameByNumber(int number)
    {
        for(EncodingsEnum encoding : EncodingsEnum.values())
        {
            if(encoding.encodingNumber == number)
            {
                return encoding.getEncodingName();
            }
        }
        throw new RuntimeException("Encoding with this number isn't supported:" + number);

    }

    public static int getEncodingNumberByName(final String name)
    {
        for(EncodingsEnum encoding : EncodingsEnum.values())
        {
            if(encoding.encodingName.equals(name))
            {
                return encoding.getEncodingNumber();
            }
        }
        throw new RuntimeException("Encoding with this name isn't supported:" + name);
    }

    public String getEncodingName()
    {
        return this.encodingName;
    }

    public int getEncodingNumber()
    {
        return this.encodingNumber;
    }
}

有一个问题,我可以创建与现有编码之一相同编号的编码,因此我需要检查枚举是否包含具有此编号的元素并抛出异常。但我不知道该怎么做。任何想法?谢谢。

最佳答案

这不应该在运行时检查:太晚了。添加一个循环访问枚举值的单元测试,并检查它们是否都有不同的数字。并确保始终执行单元测试,并检查它们是否通过,然后再生成新版本的应用程序/库。

@Test
public void encodingNumbersMustBeUnique() {
    Set<Integer> numbers = new HashSet<Integer>();
    for (EncodingsEnum e : EncodingsEnum.values()) {
        assertFalse(numbers.contains(e.getEncodingNumber()));
        numbers.add(e.getEncodingNumber());
    }
}

关于java - 如何避免 java 中的重复枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11467556/

相关文章:

c# - 如何从我的 ASP.NET MVC 属性中获取枚举值?

Java 循环引用 - 无法编译

java - AWS SDK - 非常大 - 11MB。我只想使用 SimpleDB 服务

java - 如何将枚举与命令行参数一起使用?

c# - 是否可以在 GraphQL 中发送具有多个值的 Enum

enums - 将枚举的生命周期指定为返回类型

java - 使 Main 方法重新启动/刷新

java - 从 Java 连接 MySQL 数据库时通信链路失败

java - Lucene 搜索两个或多个单词在 Android 上不起作用

asynchronous - Rust 解构枚举受 std::sync::RwLock 保护,返回引用