96 votes

Obtention d'un enum associé à une valeur int

Auparavant, mes enums LegNo étaient définis simplement comme suit :

NO_LEG, LEG_ONE, LEG_TWO

et en appelant return LegNo.values()[i]; j'ai pu obtenir la valeur associée à chaque enum.

Mais maintenant j'ai décidé que je voulais le LegNo enum NO_LEG pour être l'int -1 au lieu de 0 J'ai donc décidé d'utiliser un constructeur privé pour initialiser et définir sa valeur int.

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

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

la seule chose maintenant est que, parce que je le fais de cette façon, la values() ne fonctionnera pas pour la méthode NO_LEG enum. Comment puis-je obtenir l'enum associé à l'int ? Existe-t-il un moyen efficace de le faire, autre que l'utilisation d'une instruction de commutation de cas ou d'un if-elseif-elseif ?

Je vois que beaucoup de questions de l'OS concernent l'obtention de la valeur int de l'enum, mais je cherche l'inverse.

2voto

Andrey Lebedenko Points 425
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<>();
  }
}

1voto

DieterDP Points 1838

Puisque votre enum ne contient que 3 éléments, le moyen le plus rapide sera d'utiliser une série de if else comme vous l'avez suggéré.

edit : la réponse fournie par adarshr est mieux adaptée aux cas généraux, où il y a beaucoup de valeurs d'enum, mais je pense que c'est une surcharge pour votre problème.

1voto

Tom B Points 11
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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X