203 votes

Puis-je définir la valeur de départ d'un enum en Java ?

J'utilise l'enum pour créer quelques constantes :

enum ids {OPEN, CLOSE};

la valeur OPEN est de zéro, mais je veux qu'elle soit de 100. Est-ce possible ?

0 votes

@ScottF Voulez-vous savoir comment utiliser les enums ?

0 votes

Dans la réponse du haut, il y a une définition d'enum. J'aimerais avoir un exemple de l'utilisation de cette définition dans le code. Par exemple, comment le ctor défini serait utilisé pour créer une instance d'enum avec une valeur entière spécifique.

0 votes

@ScottF si j'étais vous, au lieu de mettre une prime sur ce post, je préfèrerais poster une toute nouvelle question..... ou, lire la documentation sur les enums. Il semble que vous ayez besoin d'acquérir des connaissances de base à ce sujet ;)

317voto

lavinio Points 12592

Les enums Java ne sont pas comme les enums C ou C++, qui ne sont en fait que des étiquettes pour les entiers.

Les enums Java sont mis en œuvre plutôt comme des classes - et ils 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 Sûreté de fonctionnement ce qui signifie que vous n'avez pas à vous soucier de l'affectation d'un enum COLOR à une variable SIZE.

Voir http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html pour plus.

0 votes

Sur la base de votre déclaration, la meilleure pratique en utilisant Java pour créer un enum d'entiers séquentiels (similaire à un enum C++), pour un index dans un tableau ou autre, serait-elle d'écrire : enum Ids { NAME(0), AGE(1), HEIGHT(2), WEIGHT(3) ; }. Merci, -bn

0 votes

C'est possible, et surtout si vous sérialisez les valeurs intégrales quelque part.

1 votes

Pouvez-vous me dire comment utiliser cet enum dans une fonction ?

97voto

Paul Morie Points 6956

Oui. Vous pouvez passer les valeurs numériques au constructeur de l'enum, comme suit :

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

  private int value;    

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

  public int getValue() {
    return value;
  }
}

Voir le Guide du langage Sun Java pour plus d'informations.

0 votes

Cool. Est-il possible de mixer ? C'est-à-dire n'attribuer que des numéros aux valeurs Enum choisies.

0 votes

Le modificateur private est redondant pour les constructeurs d'enum

0 votes

@FrederickNord - Bien sûr. Il suffit d'ajouter un deuxième constructeur privé sans argument qui initialise les données de l'utilisateur. value à un (disons) zéro. Puis inclure (disons) DANCE dans la liste des valeurs.

14voto

Maher Abuthraa Points 736

Qu'en est-il de l'utilisation de cette méthode :

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 la méthode statique et passer l'Enum comme paramètre 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 méthode mais c'est juste une autre approche.

1 votes

Pourquoi est-ce que getColorValue() synchronisées dans le deuxième exemple ?

0 votes

@josaphatv Toutes les fonctionnalités du deuxième exemple sont statiques, elles ne changent jamais. Vous pourriez vouloir HL_COLORS.getColorValue(HL_COLORS.YELLOW); sans initialiser l'enum.

11voto

serdar Points 61

Si vous utilisez des types d'enum très grands, 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;
    }
}

7voto

ggrandes Points 578

Si vous voulez émuler l'enum de C/C++ (base num et nexts incrémentaux) :

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

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