Uso de Enumeraciones en Java: Definición y Ejemplos Prácticos
Los enumerations son tipos de datos muy especiales pues este, es el único en su tipo que sirve para declarar una colección de constantes, al ser así estaremos obligados a escribirlos con mayúsculas.
Usaremos enum cada vez que necesitemos representar un conjunto fijo de constantes. Por ejemplo los días de la semana.
Así podemos declarar un enumeration usando la palabra reservada enum.
Puedo crear referencias de enumerations de la siguiente forma:
Day day;switch(day){caseMONDAY:System.out.println(“Mondays are good.”);break;caseFRIDAY:System.out.println(“Fridays are nice”);break;caseSATURDAY:case:SUNDAY:System.out.println(“Weekends are the best”);break;default:System.out.println(“Midweek are so-so”);break;}
Y puedo llamar un valor del enumeration así:
Day.MONDAY;Day.FRIDAY;Day.SATURDAY
Los enumerations pueden tener atributos, métodos y constructores, como se muestra:
Puedes crear enums dentro de clases, no solo como un archivo aparte:
Los enums son en realidad constantes estáticas
Este código:
Es lo mismo que este código:
Para acceder a os atributos de los enum hacemos lo siguiente (como hizo Anahí con el método getSpanish()):
a. Agregamos dentro de paréntesis el valor del atributo que deseemos, por ejemplo, añadiremos las palabras Domingo y Lunes a sus respectivos enums en inglés:
b. En seguida necesitaremos agregar un constructor privado con un parámetro. Puedes nombrarlo como gustes, lo importante es que lleve el mismo tipo del atributo, en este caso String:
NOTA: Puedes tener atributos de cualquier tipo, primitivos u objetos.
c. La variable s es la que contiene el valor de nuestro primer atributo, así que para recuperarla y utilizarla hacemos los siguiente:
Agregamos una variable privada String llamada spanish (o como gusten llamarla una vez más, español, traduccion_al_español, etc).
Asignamos nuestra variable nueva a la variable s dentro del constructor.
Agregamos un getter que nos permita recuperar el valor de nuestra variable spanish con el valor recuperado de la variable s.
Listo, el cómo mandar a llamar nuestro nuevo método ya lo explicó anncode, sólo quería dejar en claro algunos puntos que pudieron haberse explicado de mejor forma y con más profundidad, atando todo lo que hemos venido aprendiendo. El punto 3 es el que más me costó entender, espero no haber dejado más perdido a alguien con mi explicación.
Brother creo que tus apuntes me ayudaron a comprender mejor el alcance de esta lección.
gracias amigo, me ayudaste a comprender .
Comparto aqui un código para poder iterar, a través de los valores, con fori y con forEach :D!
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;publicclassPassword{//Here we have a num , a type date which declare a collection of constantspublicstaticenumNumero{UNO("One","Huk","Um"),DOS("Two","Iskay","Dois"),TRES("Three","Kinsa","Três"),CUATRO("Four","Tawa","Quatro"),CINCO("Five","Pisqa","Cinco"),SEIS("Six","Soqta","Seis"),SIETE("Seven","Qanchis","Sete"),OCHO("Eight","Pusaq","Oito"),NUEVE("Nine","Isqon","Nove"),DIEZ("Ten","Chunka","Dez");privateString english;privateString quechua;privateString portugues;privateNumero(String e,String q,String p){ english = e; quechua = q; portugues = p;}publicStringgetEnglish(){return english;}publicStringgetQuechua(){return quechua;}publicStringgetPortugues(){return portugues;}}publicstaticvoidmain(String[] args){for(int i =0; i <Numero.values().length; i++){System.out.println(Numero.values()[i].getQuechua()+","+Numero.values()[i].getEnglish()+","+Numero.values()[i].getPortugues());}System.out.println("\nhora en distintos idiomas :D! y con ForEach\n");for(Numero numero:Numero.values()){System.out.println(numero.getQuechua()+","+ numero.getEnglish()+","+ numero.getPortugues());}
Corrección uno es shuk y cuatro es tusku en quichua.
Excelente. Con tu aporte, me quedo bien Claro.
Gracias por tu ayuda!
Se hubiera agradecido una clase explicando mejor esto...
Para poder entender Enum es conveniente tener presente esto:
// internamente enum Day se convierte enclassDay{publicstaticfinalDay SUNDAY =newDay();publicstaticfinalDay MONDAY=newDay();publicstaticfinalDay TUESDAY=newDay();// etc...}
Gracias por la aclaración.
Se deben colocar los enumerados separados por coma, al finalizar de la definición de todos los posibles valores un punto y coma. Ademas los métodos deben ser públicos.
Me dejo un poco confundido, ya que tuesday es martes en ingles y no jueves
Haha, well played.
JAJAJA muy divertido
Estaba analizando el enum y decidí agregarle indices a los días para probar únicamente. Me di cuenta que el constructor de esta clase es privado y al principio no entendía por qué.. Pero entendí que si fuera público se podrían cambiar las constantes, que obviamente no queremos que se cambien, desde afuera y es por eso que da error si lo ponemos como público.
Muchas gracias por el link, me quedo mucho mas claro ahora.
gracias por compartir este link, tiene mucha info y es super explicativo! Me ayudo muchisimo :D
Es un poco enredado entender como inicializar los Enum, y como el constructor nunca se usa realmente por que al ser constantes todo esta Hardcodeado, pero espero que esta implementacion junta sirva para algo
<code>publicclassTest{publicenumDay{SATURDAY("Sabado","土曜日");privateString spanish;privateString japanese;privateDay(String s,String j){ spanish = s; japanese = j;}publicStringgetJapanese(){return japanese;}publicStringgetSpanish(){return spanish;}}publicstaticvoidmain(String[] args){Day day =Day.SATURDAY;switch(day){caseSATURDAY:System.out.println("Spanish: "+ day.getSpanish()+", Japanse: "+ day.getJapanese();break;default:System.out.println("Midweek are so-so");break;}}}
estas constantes deverian ir separadas con " , " en vez de " ; "
No me queda para nada claro lo de los tipos enumerados, tendré que ir a otro curso en otra plataforma para saber como y para qué se utilizan.
Iván cual es tu duda?
A mi me quedo todo claro
No sé cuando se utilizan, ni como, la verdad. Lo he intentado pero es que no llego a comprender su utilidad.
Hay muchas partes que no entendí, pero básicamente es como usar otra clase pero con la diferencia de que son constantes. En mi caso cree una clase nueva (lo hice dentro del package que tenia solamente mantenerlo "oculto"):
Primero creamos unas constantes en mayúscula y entre paréntesis puse el día en español. Creamos una variable, después el constructor que recibe el día que queremos y al final un getter que nos regresa el día en español.
En el archivo Main:
Lo que hago es llamar la clase, operador punto y el día que queremos para que nos imprima el día en ingles. Si lo queremos es el día en español agregamos un nuevo operador punto seguido del getter
no entiendo como le funciono a los compañeros si hay que cambiar varias cositas, solo Jose Oscar da una pista de que se debe hacer, los demás entendieron aunque ni siquiera lo ejecutaron.
Hice esta clase, como practica, aunque es muy baso en lo que esta en los ejemplos de la clase y de los aportes
<code>publicclassEnums{publicenumMonths{JANUARY("Enero","Janvier"),FEBRUARY("Febrero","Février"),MARCH("Marzo","Mars"),APRIL("Abril","Avril"),MAY("Mayo","Mai");privateString spanish;privateString french;privateMonths(String s,String f){ spanish = s; french = f;}publicStringgetSpanish(){return spanish;}publicvoidsetSpanish(String spanish){this.spanish= spanish;}publicStringgetFrench(){return french;}publicvoidsetFrench(String french){this.french= french;}}publicstaticvoidMonths1(Months months){switch(months){caseJANUARY:System.out.println(" January is the finish vacation");break;caseFEBRUARY:System.out.println("February is the star class");break;caseMARCH:System.out.println(" This month is the evil");break;caseAPRIL:System.out.println(" Plese help me");break;caseMAY:System.out.println(" I am dead, studying is very bored");break;}}}</code>
Y de esta forma lo llame en el main de esta forma
<code>publicstaticvoidmain(String[] args){for(Enums.Months months:Enums.Months.values()){System.out.println(months.getFrench()+" "+months.getFrench());}System.out.println(" What month are we in");ScannerSc=newScanner(System.in);String month =Sc.nextLine();Enums.Months1(Enums.Months.valueOf(month));}
Hola a todos!!! Si de algo puede servir, yo cree una clase aparte e hice respectivamente un método para llamarlo desde la clase _ "Main",_ con una pequeña lógica que funciona como un sencillo traductor de inglés a español.
Lo que hice en código fue crear una clase llamada "Days"_ y dentro de ella hice el arreglo "enum".
Cree las variables, con su constructor y los métodos Getters .
Luego cree un método estático llamado showDay, donde se le pregunta al usuario que escriba el día que desea traducir (en inglés), y el switch valida el día (en inglés) que ingresó el usuario y según el caso con el método get dentro del switch retorna el valor en español.
Una vez creado el método, lo llamo desde el método "main" en la clase que para mi caso se llama App, y corro el programa.
Espero que les sea de utilidad, yo se que es en principio un poco complicado de entender, yo también le dedique tiempo para llegar a este resultado y para comprender sobre todo como aplicarlo.