with values valueof recorrer enum java enums

valueof - java enum with values



Java Enum retorno Int (7)

Tengo problemas para declarar una enumeración. Lo que estoy tratando de crear es una enumeración para un ''Tipo de descarga'', donde hay 3 tipos de descarga (AUDIO, VIDEO, AUDIO_AND_VIDEO).

Implementé el código de la siguiente manera:

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

Esto funciona bien si luego lo uso así:

DownloadType.AUDIO_AND_VIDEO.value;

Sin embargo, me gustaría que no tenga que pedir el ''valor''. Puedo estar equivocado, pero esta es la forma en que varias clases funcionan en Java, como Font, por ejemplo, para establecer un estilo de fuente, se usa:

Font.PLAIN

Lo cual devuelve un valor int, no usamos:

Font.PLAIN.value


¿Quieres este código?

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()); }


Primero debes hacerte la siguiente pregunta: ¿Realmente necesitas una int?

El objetivo de las enumeraciones es tener una colección de elementos (constantes) que tengan un significado en el código sin depender de un valor externo (como un int). Los mensajes en Java se pueden usar como argumento en las declaraciones de cambio y se pueden comparar de forma segura utilizando el operador de igualdad "==" (entre otros).

Propuesta 1 (no se necesita int):

A menudo no hay necesidad de un número entero detrás de esto.

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

Propuesta 2 (int necesaria):

Sin embargo, a veces puede ser útil convertir una enumeración en una int (por ejemplo, si una API externa espera valores int). En este caso, aconsejaría marcar los métodos como métodos de conversión usando toXxx() -Style. Para la impresión, anule toString() .

private enum DownloadType { AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 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); //returns 0 System.out.println(DownloadType.AUDIO.name()); //returns AUDIO System.out.println(DownloadType.VIDEO.toInt()); //returns 1 System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 2

Resumen

  • No use un Entero junto con una enumeración si no es necesario.
  • No confíe en usar ordinal() para obtener un entero de una enumeración, porque este valor puede cambiar, si agrega otra constante enum o cambia el orden.
  • Normalmente no use constantes int en lugar de enumeraciones (como en la respuesta aceptada), porque perderá seguridad de tipo (como se menciona en @KennyTM).

Puedes probar este código.

private enum DownloadType { AUDIO , VIDEO , AUDIO_AND_VIDEO ; }

Puede usar esta enumeración de la siguiente manera: DownloadType.AUDIO.ordinal() . Espero que este fragmento de código te ayude.


Si está concatenando la enumeración con una cadena, puede anular el método String para devolver el int:

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

Entonces, simplemente puedes usar:

String something = "foo" + DownloadType.AUDIO;

y se invocará el método toString ().


Tenga en cuenta que el uso de toString () programáticamente generalmente se considera una práctica deficiente, está destinado solo para ojos humanos, sin embargo, esta es la única forma de lograr lo que está pidiendo.


Si necesita obtener el valor int, solo tiene un getter para el valor en su 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 }

O podrías usar el método ordinal() , que devolvería la posición de la constante enum en la enumeración.

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


Simplemente llame al método ordinal() en un valor enum, para recuperar su número correspondiente. No es necesario declarar un atributo de suma con su valor, cada valor enumerado obtiene su propio número de manera predeterminada, se asigna comenzando desde cero, incrementándose en uno para cada valor en el mismo orden en que se declararon.

No debe depender del valor int de una enum , solo en su valor real. Los mensajes en Java son un tipo diferente de monstruo y no son como enumeraciones en C, donde dependes de su código entero.

Con respecto al ejemplo que proporcionó en la pregunta, Font.PLAIN funciona porque es solo una constante entera de la clase Font. Si necesitas absolutamente un código numérico (posiblemente cambiante), entonces una enum no es la herramienta correcta para el trabajo, mejor adhiérete a las constantes numéricas.


Font.PLAIN no es una enumeración. Es solo un int . Si necesita quitar el valor de una enumeración, no puede evitar invocar un método o usar un .value . Porque las enumeraciones son en realidad objetos de su propio tipo, no primitivas.

Si realmente solo necesita una int , y ya debe aceptar que se pierde ese tipo de seguridad, el usuario puede pasar valores inválidos a su API, también puede definir esas constantes como int :

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() {} }

Por cierto, el campo de value es realmente redundante porque también hay un método .ordinal() , por lo que podría definir la enum como:

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }

y obtener el "valor" usando

DownloadType.AUDIO_AND_VIDEO.ordinal()

Editar : se corrigió el código ... static class no está permitida en Java. Vea esta respuesta SO con explicación y detalles sobre cómo definir clases estáticas en Java.