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

194

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

enum ids {OPEN, CLOSE};

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

qrtt1
la source
@ScottF Voulez-vous comment utiliser les énumérations?
Anish B.12
Dans la réponse du haut, il y a une définition d'énumération. Je voudrais un exemple de la façon dont cette énumération définie serait utilisée dans le code. Par exemple, comment le ctor défini serait-il utilisé pour créer une instance d'énumération avec une valeur entière spécifique.
ScottF
@ScottF si j'étais vous, au lieu de mettre une prime sur ce poste, je préfère poster une toute nouvelle question ..... ou lire la documentation sur les énumérations. Il semble que vous ayez besoin de saisir quelques connaissances de base à ce sujet;)
lealceldeiro
enum ids {OPEN = 100, CLOSE};?
M. Oscar

Réponses:

307

Les énumérations Java ne sont pas comme les énumérations C ou C ++, qui ne sont en réalité que des étiquettes d'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 de type sûr ce qui signifie que vous n'avez pas à vous soucier de l'attribution d'une énumération COLOR à une variable SIZE.

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

lavinio
la source
En fonction de votre déclaration, la meilleure pratique en utilisant java pour créer une énumération d'entiers séquentiels (similaire à une énumération C ++), pour un index dans un tableau ou quelque chose, consisterait à écrire: enum Ids {NAME (0), AGE (1 ), HAUTEUR (2), POIDS (3); } Merci, -bn
bn.
Peut-être, et surtout si vous sérialisez jamais les valeurs intégrales quelque part.
lavinio
1
pouvez-vous expliquer comment utiliser cette énumération dans une fonction?
Bugs Happen
2
Il est paresseux des normes Java de ne pas permettre de définir une valeur pour une énumération. Au moins, c # permet que AND soit protégé par type.
csmith
2
FWIW, C ++ 11 a désormais un type sécurisé enum class.
phoenix
92

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

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 du langage Sun Java pour plus d'informations.

Paul Morie
la source
Cool. Est-il possible de mixer? C'est-à-dire attribuer des numéros uniquement aux valeurs Enum choisies.
Frederick Nord
Le modificateur privé est redondant pour les constructeurs d'énumérations
Nino van Hooff
@FrederickNord - Bien sûr. Ajoutez simplement un deuxième constructeur privé sans argument qui s'initialise valueà un (disons) zéro. Incluez ensuite (par exemple) DANCEdans la liste des valeurs.
Stephen C
15

ce qu'il faut utiliser de cette façon:

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 l'Enum en tant que 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 façons utilisent moins de mémoire et plus d'unités de processus. Je ne dis pas que c'est la meilleure façon mais c'est juste une autre approche.

Maher Abuthraa
la source
1
Pourquoi est getColorValue()synchronisé dans le deuxième exemple?
josaphatv
@josaphatv Toutes les fonctionnalités du deuxième exemple sont statiques, elles ne changent jamais. Vous pouvez le faire HL_COLORS.getColorValue(HL_COLORS.YELLOW);sans initialiser l'énumération.
Mazunki
11

Si vous utilisez des types d'énumération très volumineux, les éléments suivants peuvent être utiles;

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;
    }
}
serdar
la source
7

Si vous souhaitez émuler l'énumération de C / C ++ (nombre de base et incréments suivants):

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
ggrandes
la source
4

La fonction ordinal () renvoie la position relative de l'identifiant dans l'énumération. Vous pouvez l'utiliser 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 réaliser que cela est très similaire à la réponse de ggrandes , mais je vais le laisser ici car il est très propre et à peu près aussi proche que possible d'une énumération de style C.

maharvey67
la source
Dans l'exemple, vous prenez une énumération et obtenez un int. Pouvez-vous montrer l'inverse, prendre un entier et vous retrouver avec une énumération (sans casse de commutateur explicite pour chaque valeur?)
ScottF
Selon la question, je pense que c'est la réponse la plus appropriée. Ici, nous avons changé l'index par défaut d'énumération à partir de 100 sans définir de nouvelle variable et les assigner via le constructeur.
Rahul Jain
@RahulJain Je préfère utiliser la réponse acceptée. Cela me semble plus propre.
lealceldeiro
1

@scottf

Une énumération est comme un singleton. La JVM crée l'instance.

Si vous le créiez vous-même avec des classes, cela pourrait ressembler à ça

public static class MyEnum {

    final public static MyEnum ONE;
    final public static MyEnum TWO;

    static {
        ONE = new MyEnum("1");
        TWO = new MyEnum("2");
    }

    final String enumValue;

    private MyEnum(String value){
        enumValue = value;    
    }

    @Override
    public String toString(){
        return enumValue;
    }


}

Et pourrait être utilisé comme ça:

public class HelloWorld{

   public static class MyEnum {

       final public static MyEnum ONE;
       final public static MyEnum TWO;

       static {
          ONE = new MyEnum("1");
          TWO = new MyEnum("2");
       }

       final String enumValue;

       private MyEnum(String value){
           enumValue = value;    
       }

       @Override
       public String toString(){
           return enumValue;
       }


   }

    public static void main(String []args){

       System.out.println(MyEnum.ONE);
       System.out.println(MyEnum.TWO);

       System.out.println(MyEnum.ONE == MyEnum.ONE);

       System.out.println("Hello World");
    }
}
sperling
la source
0
 public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     System.out.println(id1.getValue());
    }
}

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

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

@scottf, vous avez probablement confondu à cause du constructeur défini dans l'ENUM.

Permettez-moi d'expliquer cela.

Lors du class loaderchargement de la enumclasse, le enumconstructeur est également appelé. Sur quoi!! Oui, c'est appelé OPENet close. Avec quelles valeurs 100pour OPENet 200pourclose

Puis-je avoir une valeur différente?

Oui,

public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     id1.setValue(2);
     System.out.println(id1.getValue());
    }
}

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

    private int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
    public void setValue(int value) { id = value; }
}

Mais c'est une mauvaise pratique. enumest utilisé pour représenter constantscomme days of week, colors in rainbowc'est -à- dire un petit groupe de constantes prédéfinies.

Gibbs
la source
0

Je pense que vous êtes confus de regarder les énumérateurs C ++. Les énumérateurs Java sont différents.

Ce serait le code si vous êtes habitué aux énumérations C / C ++:

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);
}
};
Coristat
la source