web-dev-qa-db-fra.com

Puis-je définir une valeur de départ enum en Java?

J'utilise l'énum pour faire quelques constantes:

enum ids {OPEN, CLOSE};

la valeur OPEN est égale à zéro, mais je la veux à 100. Est-ce possible?

177
qrtt1

Les énumérations Java ne ressemblent pas aux énumérations C ou C++, qui ne sont en réalité que des étiquettes pour des entiers.

Les énumérations Java sont implémentées plus comme des classes - et elles peuvent même avoir plusieurs attributs.

public enum Ids {
    OPEN(100), CLOSE(200);

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

La grande différence est qu'ils sont compatibles avec le type , ce qui signifie que vous n'avez pas à vous soucier de l'affectation d'une énumération COLOR à une variable SIZE.

Voir http://docs.Oracle.com/javase/tutorial/Java/javaOO/enum.html pour plus d'informations.

292
lavinio

Oui. Vous pouvez transmettre les valeurs numériques au constructeur pour l'énumération, comme suit:

enum Ids {
  OPEN(100),
  CLOSE(200);

  private int value;    

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

  public int getValue() {
    return value;
  }
}

Reportez-vous au Guide de la langue de Sun Java pour plus d'informations.

88
Paul Morie

à propos de l’utilisation de cette manière:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public int getColorValue() {
              switch (this) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }
}

il n'y a qu'une seule méthode ..

vous pouvez utiliser une méthode statique et passer le paramètre Enum comme:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public static int getColorValue(HL_COLORS hl) {
              switch (hl) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }

Notez que ces deux méthodes utilisent moins de mémoire et plus d’unités de traitement. Je ne dis pas que c’est la meilleure, mais c’est une autre approche.

12
Maher Abuthraa

Si vous utilisez de très gros types enum, alors, ce qui suit peut être utile.

public enum deneme {

    UPDATE, UPDATE_FAILED;

    private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
    private static final int START_VALUE = 100;
    private int value;

    static {
        for(int i=0;i<values().length;i++)
        {
            values()[i].value = START_VALUE + i;
            ss.put(values()[i].value, values()[i]);
        }
    }

    public static deneme fromInt(int i) {
        return ss.get(i);
    }

    public int value() {
    return value;
    }
}
10
serdar

Si vous voulez émuler une énumération de C/C++ (base incrémentielle et suivante incrémentale):

enum ids {
    OPEN, CLOSE;
    //
    private static final int BASE_ORDINAL = 100;
    public int getCode() {
        return ordinal() + BASE_ORDINAL;
    }
};

public class TestEnum {
    public static void main (String... args){
        for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
            System.out.println(i.toString() + " " + 
                i.ordinal() + " " + 
                i.getCode());
        }
    }
}
OPEN 0 100
CLOSE 1 101
6
ggrandes

La fonction ordinal () renvoie la position relative de l'identifiant dans l'enum. Vous pouvez utiliser ceci pour obtenir une indexation automatique avec un décalage, comme avec une énumération de style C.

Exemple:

public class TestEnum {
    enum ids {
        OPEN,
        CLOSE,
        OTHER;

        public final int value = 100 + ordinal();
    };

    public static void main(String arg[]) {
        System.out.println("OPEN:  " + ids.OPEN.value);
        System.out.println("CLOSE: " + ids.CLOSE.value);
        System.out.println("OTHER: " + ids.OTHER.value);
    }
};

Donne la sortie:

OPEN:  100
CLOSE: 101
OTHER: 102

Edit: je viens de me rendre compte que cela ressemble beaucoup à réponse de ggrandes , mais je vais le laisser ici car il est très propre et à peu près aussi proche que possible Enum de style C.

1
maharvey67