在Java中具有负值/缺口值的枚举

Fry*_*Fry 2 java enums

我在Java中遇到枚举问题.我有一个枚举,从-1:

    public enum AipType {
        Unknown(-1),
        None(0),
        AipMod(1),
        AipNoMod(2);

        private final int id;
        AipType(int id) {this.id = id;}
        public int getValue() {return id;}
    }
Run Code Online (Sandbox Code Playgroud)

问题是当我使用此代码初始化var的时候 AipType

AipType at = AipType.getValues()[index];
Run Code Online (Sandbox Code Playgroud)

index区间中[-1,0,1,2]的数字在哪里-1搞乱了价值.即0返回Unknown,1返回AipMod,2返回AipNoMod.

我使用了这个实现,因为我需要手动设置每个枚举案例的数值.在其他情况下,我有一个差距beetwen值,所以我有同样的问题:我不能使用values(),然后访问[ ].

我试着用这种方式初始化

AipType at = AipType(index);
Run Code Online (Sandbox Code Playgroud)

但不起作用.

想法?谢谢...

Roh*_*ain 6

我们不知道getValues()你正在使用的方法是什么.它应该是values().

无论如何,您总是可以static在您的方法中添加一个方法enum,该方法返回该enum值的正确实例,并在您需要的任何地方调用它:

public enum AipType {
    Unknown(-1),
    None(0),
    AipMod(1),
    AipNoMod(2);

    private final int id;
    AipType(int id) {this.id = id;}
    public int getValue() {return id;}

    public static AipType fromValue(int id) {
        for (AipType aip: values()) {
            if (aip.getValue() == id) {
                return aip;
            }
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您fromValue()经常调用,您可能还希望缓存由values()内部返回的数组enum,并使用它.或者甚至更好,map一个更好的主意.


mat*_*t b 5

Enum.getValues() 根据枚举类中的定义顺序返回枚举数组.

getValues()不知道您添加到枚举中的id字段或getValue()方法.

你可以做什么而不是调用getValues()[-1](顺便说一句,你永远不能用Java索引数组中的数组)是添加一个静态函数,如:

static AipType getAipType(int id) {
    for (AipType a : getValues()) {
        if (a.getId() == id) return a;
    }
    throw new IllegalArgumentException("id=" + id + " does not exist");
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

只需拥有一个Map<Integer, AipType>而不是使用values(),并通过一个方法公开对它的访问:

public enum AipType {
    UNKNOWN(-1),
    NONE(0),
    MOD(1),
    NO_MOD(2);

    private static final Map<Integer, AipType> VALUE_TO_ENUM_MAP;
    private final int value;

    static {
        VALUE_TO_ENUM_MAP = new HashMap<>();
        for (AipType type : EnumSet.allOf(AipType.class)) {
            VALUE_TO_ENUM_MAP.put(type.value, type);
        }
    }

    private AipType(int value) {
        this.value = value;
    }

    public int getValue() {
        return id;
    }

    public static AipType forValue(int value) {
        return VALUE_TO_ENUM_MAP.get(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将是关于值的完全灵活 - 或者您仍然可以使用数组并恰好抵消它.