1. Antecedentes sobre cómo enum
surgió
Hoy exploraremos otro tipo de tipo de datos en Java: enum
. El nombre enum
proviene de la palabra enumeración . ¿Qué es este tipo de datos y para qué sirve?
A veces, un programador necesita crear un nuevo tipo de datos, cuyos valores posibles se limitan a una pequeña lista fija.
Por ejemplo, un DayOfTheWeek
tipo solo puede tomar los valores MONDAY
, TUESDAY
, WEDNESDAY
, ... Hay 7 valores en total. O un Month
tipo solo puede tomar los valores JANUARY
, FEBRUARY
, MARCH
, ... Hay 12 valores en total.
Por supuesto, puede usar números (el int
tipo): 1
— lunes, 2
— martes, etc. Pero alguien podría asignar accidentalmente valores no válidos como 8
o 0
a su variable.
Fácilmente podría tener una situación en la que un programador piense que los días de la semana (o los meses del año) se numeran a partir de cero, mientras que otros esperan que su numeración comience a partir de uno, etc.
Es por eso que introdujo Java enum
, un tipo de datos que consta de un conjunto finito de valores .
2. Declarar un tipo
La declaración de un nuevo enum
tipo de datos se ve así:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Donde TypeName
es el nombre del nuevo tipo (clase), y los posibles valores están separados por comas y encerrados entre llaves: Value1
, Value2
, Value3
.
Como ejemplo, vamos a crear el nuestro propio DayOfTheWeek
enum
:
Código | Nota |
---|---|
|
Nuevo Day tipo Lunes Martes Miércoles Jueves Viernes Sábado Domingo |
Así es como se asigna un valor a una variable de nuestro nuevo tipo:
Day day = Day.MONDAY;
Ejemplo:
Código | Nota |
---|---|
|
La salida de pantalla será:
|
3. Métodos de unenum
Un enum
tipo tiene varios métodos integrados, dos de los cuales son muy interesantes:
El método estático values()
devuelve una matriz de todos los valores del enum
tipo:
Código | Nota |
---|---|
|
La days variable almacena una matriz que contiene los valores del Day tipo (7 elementos) Muestra el contenido de la matriz en la pantalla:
|
El ordinal()
método devuelve el número ordinal de la constante. Lo llamas en un enum
valor en lugar de una enum
clase:
Código | Salida de consola |
---|---|
|
|
4. Convertir a una clase
En realidad, no hay nada mágico aquí. El compilador nos acaba de dar algo de azúcar sintáctico. En tiempo de compilación, la Day
enumeración se convierte en una clase ordinaria:
Código, versión simplificada | Nota |
---|---|
|
Day clase Lista de constantes estáticas Una matriz con todos los valores de la Day enumeración Una variable que almacena el valor de un Day objeto específico La Day clase constructor es privada, lo que significa que los objetos de la Day clase solo se pueden crear dentro de la Day clase. El ordinal método debe ser llamado en un Day objeto. Devuelve el valor del objeto: el value campo. El método devuelve una matriz estática con todos los valores de la Day clase . |
Si eliminamos todos los métodos y variables estáticos de la Day
clase, obtenemos lo siguiente:
Código | Nota |
---|---|
|
La value variable almacena el valor del Day objeto. Day Los objetos solo se pueden crear dentro de la Day clase, ya que el constructor es private . El ordinal() método devuelve el value del Day objeto. |
En otras palabras, nada aterrador está sucediendo aquí. El compilador crea la Day
clase, agrega las constantes que representan los enum
valores, agrega los métodos necesarios y crea el constructor de la clase private
. Veremos cómo funcionan los constructores un poco más tarde.
Con suerte, ahora está claro por qué asignamos un valor a una variable de esta manera:
Day day = Day.MONDAY;
MONDAY
es solo un campo estático (constante) en la Day
clase. Al acceder a métodos y campos estáticos desde fuera de la clase, debe indicar el nombre de la clase antes del nombre del campo o método.
5. Más métodos de unenum
Cada enum
clase tiene varias características interesantes.
Convertir a y desde una cadena
Para convertir un objeto de enumeración en una cadena, debe llamar a su toString()
método.
String str = Day.MONDAY.toString();
Para convertir en la otra dirección (de una cadena a un Day
objeto), puede usar el valueOf()
método estático:
Day day = Day.valueOf("MONDAY");
Es muy conveniente y será útil en muchos casos.
Convertir a un número y viceversa
Ya sabes cómo convertir un enum
objeto en un número: llama al ordinal()
método:
int index = Day.MONDAY.ordinal();
Para convertir en la otra dirección (de un número a un Day
objeto), necesita una construcción más transparente:
Day day = Day.values()[2];
Ejemplos:
Código | Nota |
---|---|
|
Lunes Obtener el índice del lunes: 0 Día de la semana 2 días después del lunes |
Punto importante: debido a que enum
los valores son un conjunto fijo de constantes, se pueden comparar usando == . En otras palabras, no puede tener dos MONDAY
objetos idénticos con direcciones diferentes. Solo existe una única instancia de cada valor de enumeración. Y eso significa que comparar variables de enumeración usando == siempre funcionará.
6. Agregar sus propios métodos a unenum
Debido a que an enum
se convierte en una clase ordinaria en tiempo de compilación, puede declarar métodos en ella. Estos métodos simplemente se agregan a la clase que genera el compilador. Por ejemplo, supongamos que queremos Day enum
que devuelva una lista de valores de enumeración en lugar de una matriz.
Luego podemos agregar el siguiente código:
Código | Nota |
---|---|
|
Se requiere un punto y coma después de la lista de valores. Crea un ArrayList objeto Agrega los valores en la matriz devuelta por el values() método. Devuelve la lista. |
Ahora este método se puede llamar en código:
Código | Nota |
---|---|
|
La list variable almacenará una lista de todos los valores de Day enum . |
GO TO FULL VERSION