Java – Getting enum associated with int value

enumsjava

Previously, I had my LegNo enums defined simply as:

NO_LEG, LEG_ONE, LEG_TWO

and by calling return LegNo.values()[i];, I was able to get the value associated with each enum.

But now I've decided I want the LegNo enum NO_LEG to be the int -1 instead of 0
so I decided to use a private constructor to initialise and set its int value

NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

private LegNo(final int leg) { legNo = leg; }

the only thing now is that because I'm doing it this way the values() method will not work for the NO_LEG enum. How do I get the enum associated with the int? Is there any efficient way of doing this other than using a case switch statement or an if-elseif-elseif

I can see a lot of SO questions to do with getting the int value from the enum, but I'm after the reverse.

Best Answer

EDIT August 2018

Today I would implement this as follows

public enum LegNo {
    NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

    private final int value;

    LegNo(int value) {
        this.value = value;
    }

    public static Optional<LegNo> valueOf(int value) {
        return Arrays.stream(values())
            .filter(legNo -> legNo.value == value)
            .findFirst();
    }
}

You'll have to maintain a mapping inside the enum.

public enum LegNo {
    NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

    private int legNo;

    private static Map<Integer, LegNo> map = new HashMap<Integer, LegNo>();

    static {
        for (LegNo legEnum : LegNo.values()) {
            map.put(legEnum.legNo, legEnum);
        }
    }

    private LegNo(final int leg) { legNo = leg; }

    public static LegNo valueOf(int legNo) {
        return map.get(legNo);
    }
}

The static block will be invoked only once, so there is practically no performance issue here.

EDIT: Renamed the method to valueOf as it is more inline with other Java classes.