290 votes

Comment convertir la valeur d'un enum en int ?

J'ai une fonction qui retourne un type int. Cependant, je n'ai qu'une valeur de l'énumération TAX.

Comment puis-je convertir la valeur de l'énumération TAX en un int ?

public enum TAX {
    NOTAX(0),SALESTAX(10),IMPORTEDTAX(5);

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

TAX var = TAX.NOTAX; // This value will differ

public int getTaxValue()
{
  // what do do here?
  // return (int)var;
}

1 votes

392voto

Jon Skeet Points 692016

Vous devez faire en sorte que l'enum expose value d'une manière ou d'une autre, par exemple

public enum Tax {
    NONE(0), SALES(10), IMPORT(5);

    private final int value;
    private Tax(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

...

public int getTaxValue() {
    Tax tax = Tax.NONE; // Or whatever
    return tax.getValue();
}

(J'ai changé les noms pour qu'ils soient un peu plus conventionnels et lisibles, btw).

C'est en supposant que vous voulez que la valeur soit assignée dans le constructeur. Si ce n'est pas ce que vous voulez, vous devrez nous donner plus d'informations.

1 votes

@likejiujitsu : C'est aller dans la direction opposée. Dans cette question, le PO a déjà a une valeur de type Tax et veut en obtenir la valeur numérique.

1 votes

Je viens d'essayer et je réalise que ça échoue myEnumValue = MyEnum.valueOf(myInt); l'argument doit être de type String - ou y a-t-il quelque chose qui m'échappe ?

1 votes

Cette solution est pire que rien. Il semble que les enums ne doivent pas être utilisés en Java ? Ou le JDK 1.8 a changé cela ?

281voto

vivia Points 575

Je préfère ça :

public enum Color {

   White,

   Green,

   Blue,

   Purple,

   Orange,

   Red
}

alors :

//cast enum to int
int color = Color.Blue.ordinal();

39 votes

C'est incorrect/non recommandé par Joshua Bloch dans son livre Effective Java (2e édition). Voir le point 31.

1 votes

Il n'est pas recommandé d'utiliser directement la méthode ordinal().

69 votes

@user504342 Je n'ai pas la 2ème édition du livre donc pouvez-vous nous donner l'essentiel de la raison pour laquelle il n'est pas recommandé ?

27voto

user3180812 Points 11

Parfois, une approche C# facilite la vie dans le monde Java.. :

class XLINK {
static final short PAYLOAD = 102, ACK = 103, PAYLOAD_AND_ACK = 104;
}
//Now is trivial to use it like a C# enum:
int rcv = XLINK.ACK;

0 votes

Pour moi, c'est la façon la plus souhaitable de procéder. Je bénéficie des avantages de l'enum (clarté du code), d'un type de données convivial pour la base de données et je n'ai pas à rechercher 100 alternatives d'enum pour le faire à la "manière Android". C'est simple et efficace.

0 votes

Joli. C'est comme si l'enum java était complètement déconnecté de la réalité de l'utilisation d'un enum... surtout si les gens commencent à en abuser pour des choses comme les singletons. Cette approche a le désavantage de ne pas avoir un moyen facile d'obtenir toutes les valeurs.

4 votes

Cela n'a-t-il pas l'inconvénient d'essayer de passer une valeur d'enum à une méthode ? Vous ne pouvez plus passer un XLINK à une méthode, car il ne représente rien de concret. Vous perdez le typage dans votre méthode. La signature de la méthode devrait lire short au lieu de XLINK.

18voto

unholysampler Points 9454

Si vous voulez la valeur que vous attribuez dans le constructeur, vous devez ajouter une méthode dans la définition de l'enum pour retourner cette valeur.

Si vous voulez un nombre unique qui représente la valeur de l'enum, vous pouvez utiliser ordinal() .

2 votes

Faites attention. Il y a beaucoup d'autres anti-modèles de développement qui reposent sur ordinal() que des cas d'utilisation valables pour ordinal() . Si vous avez besoin de stocker une valeur unique pour l'attribut enum alors il suffit de stocker le enum . Il existe des EnumSets, des Lists of Enums, des EnumMaps, et presque toutes les autres collections d'Enum que vous pourriez souhaiter.

1 votes

@EdwinBuck : C'est bien de le souligner, je voulais juste mentionner l'existence de ordinal() parce que le PO n'a pas précisé ce qu'il voulait que l'int soit réellement.

1 votes

Ne prenez pas d'ordonnance. Veuillez vérifier l'api enum à ce sujet. Vote positif supprimé.

3voto

Mike Points 111

Il est peut-être préférable d'utiliser une représentation sous forme de String plutôt que d'entier, car le String reste valide si des valeurs sont ajoutées à l'enum. Vous pouvez utiliser la méthode name() de l'enum pour convertir la valeur de l'enum en String et la méthode valueOf() de l'enum pour créer à nouveau une représentation de l'enum à partir du String. L'exemple suivant montre comment convertir la valeur de l'enum en String et inversement (ValueType est un enum) :

ValueType expected = ValueType.FLOAT;
String value = expected.name();

System.out.println("Name value: " + value);

ValueType actual = ValueType.valueOf(value);

if(expected.equals(actual)) System.out.println("Values are equal");

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