web-dev-qa-db-fra.com

Java Enum return Int

J'ai du mal à déclarer une enum. Ce que j'essaie de créer est une énumération pour un 'DownloadType', où il existe 3 types de téléchargement (AUDIO, VIDEO, AUDIO_AND_VIDEO).

J'ai implémenté le code comme suit:

private enum DownloadType {
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2);
    private final int value;

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

Cela fonctionne bien si je l'utilise ensuite comme ceci:

DownloadType.AUDIO_AND_VIDEO.value;

Cependant, j'aimerais bien que je n'aie pas à demander la "valeur". Je peux me tromper, mais c’est ainsi que plusieurs classes fonctionnent dans Java, par exemple, Police, par exemple pour définir un style de police, vous utilisez:

Font.PLAIN

Ce qui retourne une valeur int, nous n'utilisons pas:

Font.PLAIN.value
65
Cristian

Font.PLAIN est pas une énumération. C'est juste un int. Si vous devez extraire la valeur d'une énumération, vous ne pouvez pas éviter d'appeler une méthode ou d'utiliser un .value, Car les énumérations sont en réalité des objets de son propre type, pas des primitives.

Si vous n'avez vraiment besoin que de int, et vous acceptez déjà que la sécurité du type soit perdue, l'utilisateur peut transmettre des valeurs non valides à votre API, vous pouvez définir ces constantes comme int également:

public final class DownloadType {
    public static final int AUDIO = 0;
    public static final int VIDEO = 1;
    public static final int AUDIO_AND_VIDEO = 2;

    // If you have only static members and want to simulate a static
    // class in Java, then you can make the constructor private.
    private DownloadType() {}
}

À propos, le champ value est en réalité redondant car il existe également une méthode .ordinal(), vous pouvez donc définir le enum comme:

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }

et obtenez la "valeur" en utilisant

DownloadType.AUDIO_AND_VIDEO.ordinal()

Edit : Corrigé le code .. static class N'est pas autorisé en Java. Voir this SO answer avec l'explication et les détails sur la façon de définir des classes statiques en Java.

94
kennytm

Si vous avez besoin d'obtenir la valeur int, il suffit d'avoir un getter pour la valeur dans votre ENUM:

private enum DownloadType {
    AUDIO(1), VIDEO(2), AUDIO_AND_VIDEO(3);
    private final int value;

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

    public int getValue() {
        return value;
    }
}

public static void main(String[] args) {
    System.out.println(DownloadType.AUDIO.getValue());           //returns 1
    System.out.println(DownloadType.VIDEO.getValue());           //returns 2
    System.out.println(DownloadType.AUDIO_AND_VIDEO.getValue()); //returns 3
}

Ou vous pouvez simplement utiliser la méthode ordinal(), qui renverrait la position de la constante enum dans l'énum.

private enum DownloadType {
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2);
    //rest of the code
}

System.out.println(DownloadType.AUDIO.ordinal());            //returns 0
System.out.println(DownloadType.VIDEO.ordinal());            //returns 1
System.out.println(DownloadType.AUDIO_AND_VIDEO.ordinal()); //returns 2
48
PermGenError

D'abord, vous devriez vous poser la question suivante: Avez-vous vraiment besoin d'un int?

Le but des enums est d'avoir une collection d'éléments (constantes), qui ont une signification dans le code sans s'appuyer sur une valeur externe (comme un int). Les énumérations dans Java peuvent être utilisées comme arguments dans les instructions de commutateur et peuvent être comparées en toute sécurité à l'aide de l'opérateur d'égalité "==" (entre autres).

Proposition 1 (aucun int nécessaire):

Souvent, il n'y a pas besoin d'un entier derrière, utilisez simplement ceci:

private enum DownloadType{
    AUDIO, VIDEO, AUDIO_AND_VIDEO
}

Usage:

DownloadType downloadType = MyObj.getDownloadType();
if (downloadType == DownloadType.AUDIO) {
    //...
}
//or
switch (downloadType) {
  case AUDIO:  //...
          break;
  case VIDEO: //...
          break;
  case AUDIO_AND_VIDEO: //...
          break;
}

Proposition 2 (int nécessaire):

Néanmoins, il peut parfois être utile de convertir une énumération en int (par exemple, si une API externe attend des valeurs int). Dans ce cas, je conseillerais de marquer les méthodes en tant que méthodes de conversion en utilisant le toXxx()- Style. Pour l'impression, remplacez toString().

private enum DownloadType {
    AUDIO(2), VIDEO(5), AUDIO_AND_VIDEO(11);
    private final int code;

    private DownloadType(int code) {
        this.code = code;
    }

    public int toInt() {
        return code;
    }

    public String toString() {
        //only override toString, if the returned value has a meaning for the
        //human viewing this value 
        return String.valueOf(code);
    }
}

System.out.println(DownloadType.AUDIO.toInt());           //returns 2
System.out.println(DownloadType.AUDIO);                   //returns 2 via `toString/code`
System.out.println(DownloadType.AUDIO).ordinal();         //returns 0
System.out.println(DownloadType.AUDIO.name());            //returns AUDIO
System.out.println(DownloadType.VIDEO.toInt());           //returns 5
System.out.println(DownloadType.VIDEO.ordinal());         //returns 1
System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 11

Résumé

  • N'utilisez pas un entier avec un enum si vous n'y êtes pas obligé.
  • Ne comptez pas sur ordinal() pour obtenir un entier d'une énumération, car cette valeur peut changer si vous modifiez l'ordre (par exemple en insérant une valeur). Si vous envisagez d'utiliser ordinal(), il peut être préférable d'utiliser la proposition 1.
  • Normalement, n'utilisez pas les constantes int au lieu d'enums (comme dans la réponse acceptée), car vous perdrez la sécurité de type.
12
yonojoy

Appelez simplement la méthode ordinal() sur une valeur enum pour récupérer le numéro correspondant. Il n'est pas nécessaire de déclarer un attribut d'addition avec sa valeur, chaque valeur énumérée obtenant son propre numéro par défaut, attribué à partir de zéro, incrémenté de un pour chaque valeur dans le même ordre dans lequel elles ont été déclarées.

Vous ne devriez pas dépendre de la valeur int d'un enum, mais uniquement de sa valeur réelle. Les enums in Java sont un autre type de monstre et ne ressemblent pas à des enums en C, où vous dépendez de leur code entier.

En ce qui concerne l'exemple que vous avez fourni dans la question, Font.PLAIN fonctionne parce qu'il ne s'agit que d'une constante entière de la classe Font. Si vous avez absolument besoin d'un code numérique (éventuellement en cours de modification), alors un enum n'est pas le bon outil pour le travail, il vaut mieux s'en tenir aux constantes numériques.

10
Óscar López

Vous pouvez essayer ce code.

private enum DownloadType {
    AUDIO , VIDEO , AUDIO_AND_VIDEO ;

}

Vous pouvez utiliser cette énumération comme ceci: DownloadType.AUDIO.ordinal(). J'espère que cet extrait de code vous aidera.

4
osimer pothe

Voulez-vous ce code?

public static enum FieldIndex {
    HDB_TRX_ID,     //TRX ID
    HDB_SYS_ID      //SYSTEM ID
}

public String print(ArrayList<String> itemName){
    return itemName.get(FieldIndex.HDB_TRX_ID.ordinal());
}
3
seyeon

Si vous concaténez l'énum avec une chaîne, vous pouvez remplacer la méthode toString pour renvoyer l'int:

public String toString() {
    return value + "";
}

Ensuite, vous pouvez simplement utiliser:

String something = "foo" + DownloadType.AUDIO;

et la méthode toString () sera invoquée.


Notez que l’utilisation de toString () par programmation est généralement considérée comme une mauvaise pratique - elle est destinée à un œil humain uniquement, mais c’est le seul moyen d’obtenir ce que vous demandez.

3
Bohemian