Раньше мои перечисления LegNo определялись просто как:
NO_LEG, LEG_ONE, LEG_TWO
и позвонив return LegNo.values()[i];
, я смог получить значение, связанное с каждым перечислением.
Но теперь я решил, что хочу, чтобы LegNo
перечисление NO_LEG
было int -1 вместо 0, поэтому я решил использовать частный конструктор для инициализации и установки его значения int.
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private LegNo(final int leg) { legNo = leg; }
единственное, что сейчас это то, что, поскольку я делаю это таким образом, values()
метод не будет работать для NO_LEG
перечисления. Как мне получить перечисление, связанное с int? Есть ли какой-либо эффективный способ сделать это, кроме использования оператора case switch или if-elseif-elseif
Я вижу много SO-вопросов, связанных с получением значения int из перечисления, но я ищу обратное.
LegNo foo = LegNo.valueOf(2);
. Предыдущий код вернетLegNo.LEG_TWO
.null
, как и ожидалось, с помощью HashMap.get : возвращает значение, которому сопоставлен указанный ключ, или null, если эта карта не содержит сопоставления для ключа.valueOf()
используете перечисление из 1000 членов внутри другого цикла.Вы также можете включить в перечисление статический метод, который выполняет итерацию по всем членам и возвращает правильный.
public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private int legIndex; private LegNo(int legIndex) { this.legIndex = legIndex; } public static LegNo getLeg(int legIndex) { for (LegNo l : LegNo.values()) { if (l.legIndex == legIndex) return l; } throw new IllegalArgumentException("Leg not found. Amputated?"); } }
Теперь, если вы хотите получить значение Enum целым числом, вы просто используете:
int myLegIndex = 1; //expected : LEG_ONE LegNo myLeg = LegNo.getLeg(myLegIndex);
источник
Ответ adarshr адаптирован к Java 8:
import static java.util.Arrays.stream; import static java.util.stream.Collectors.toMap; import java.util.Map; public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private final int legNo; private final static Map<Integer, LegNo> map = stream(LegNo.values()).collect(toMap(leg -> leg.legNo, leg -> leg)); private LegNo(final int leg) { legNo = leg; } public static LegNo valueOf(int legNo) { return map.get(legNo); } }
источник
Вы также можете получить доступ к значению Enum, соответствующему заданному целочисленному значению, просто вызвав метод values () для enum LegNo. Возвращает поле перечислений LegNo:
LegNo.values()[0]; //returns LEG_NO LegNo.values()[1]; //returns LEG_ONE LegNo.values()[2]; //returns LEG_TWO
Не совсем то, что он искал, но довольно близко и действительно очень просто. (Хотя объект мертв, он может быть полезен кому-то другому.)
источник
Java 8 способ со значением по умолчанию:
public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private final int legNo; LegNo(int legNo) { this.legNo = legNo; } public static LegNo find(int legNo, Supplier<? extends LegNo> byDef) { return Arrays.asList(LegNo.values()).stream() .filter(e -> e.legNo == legNo).findFirst().orElseGet(byDef); } }
звонить:
LegNo res = LegNo.find(0, () -> LegNo.NO_LEG);
или с исключением:
LegNo res = LegNo.find(0, () -> { throw new RuntimeException("No found"); });
источник
public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private final int code; LegNo(int code) { this.code = code; ReverseStorage.reverseMap.put(code, this); } public static Optional<LegNo> getByCode(int code) { return Optional.ofNullable(ReverseStorage.reverseMap.get(code)); } private static final class ReverseStorage { private static final Map<Integer, LegNo> reverseMap = new LinkedHashMap<>(); } }
источник
Поскольку ваше перечисление содержит только 3 элемента, самым быстрым способом будет просто использовать серию
if else
, как вы предложили.edit: ответ, который предоставил adarshr, лучше подходит для общих случаев, когда есть много значений перечисления, но я думаю, что это излишек для вашей проблемы.
источник
Map
в вашем коде, конечно, не излишество. Кроме того, это делает метод намного чище, чем набор условий if-else.public LegNo valueOf(int value)
не должна изменяться. Тогда if-else можно было бы записать в самом перечислении. Если if-else выходит из перечисления, то это, безусловно, становится не очень чистым кодом.public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private int legNo; private LegNo(int leg) { legNo = leg; } public static LegNo valueOf(int legNo) { for (LegNo leg : LegNo.values()) { if (leg.legNo == legNo) return leg; } } } assert LegNo.valueOf(2) == LegNo.LEG_TWO assert LegNo.valueOf(3) == null
источник