Vous êtes sur la page 1sur 6

22/3/2015

Enum(Enumerados)enJava,conejemplosJarroba

Enum(Enumerados)enJava,con
ejemplos
ElproyectodeestepostlopuedesdescargarpulsandoAQUI.
Un enumerado (o Enum) es una clase especial (tanto en Java como en otros
lenguajes) que limitan la creacin de objetos a los especificados explcitamente en la
implementacin de la clase.La nica limitacin que tienen los enumerados respecto a una clase
normalesquesitieneconstructor,estedebedeserprivadoparaquenosepuedancrearnuevos
objetos.
VamosaempezarconunsencilloejemplosobreunaclaseEnum.Volviendoalosejemplo
relacionadosconelftbol,tenemosquelofutbolistasestncaracterizadosporunademarcacinala
horadejugarunpartidodeftbol,portantolasdemarcacionesenlasquepuedejugarunfutbolista
sonfinitasyportantosepuedenenumeraren:Portero,Defensa,CentrocampistayDelantero.Con
estaespecificacinpodemoscrearnoslasiguienteclaseEnumllamadaDemarcacin:
publicenumDemarcacion
{
PORTERO,DEFENSA,CENTROCAMPISTA,DELANTERO
}

Porconvenio(aunquelopodisponercomoqueris)losnombresdelosenumerados
seescribenenmaysculas.
EsmuyimportanteentenderqueunEnumenjavaesrealmenteunaclase(cuyosobjetos
solopuedenserlosdefinidosenestaclase:PORTERO,,DELANTERO)queheredadelaclase
Enum(java.lang.Enum)yportantolosenumeradostienenunaseriedemtodosheredadosdeesa
clasepadre(PulsarAQUIparaversuJavaDoc).Acontinuacinvamosamostraralgunosdelos
mtodosmsutilizadosdelosenumerados:
publicenumDemarcacion{PORTERO,DEFENSA,CENTROCAMPISTA,DEL
ANTERO}
Demarcaciondelantero=Demarcacion.DELANTERO;//Instanci
adeunenumdelaclaseDemarcacin
delantero.name();//DevuelveunStringconelnombredel
aconstante(DELANTERO)
delantero.toString();//DevuelveunStringconelnombre
delaconstante(DELANTERO)
delantero.ordinal();//Devuelveunenteroconlaposicin
delenumsegnestdeclarada(3).
delantero.compareTo(Enumotro);//Comparaelenumconel
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 1/6

22/3/2015

Enum(Enumerados)enJava,conejemplosJarroba

parmetrosegnelordenenelqueestndeclaradosloenum
Demarcacion.values();//Devuelveunarrayquecontieneto
doslosenum

Vistocualessonlosmtodosmsutilizadosdentrodelosenumerados,vamosaponerun
ejemploparaverlosresultadosquenosdevuelvenestosmtodos.Dadoelsiguientefragmentode
cdigo:
Demarcaciondelantero=Demarcacion.DELANTERO;
Demarcaciondefensa=Demarcacion.DEFENSA;

//DevuelveunStringconelnombredelaconstante
System.out.println("delantero.name()="+delantero.name());
System.out.println("defensa.toString()="+defensa.toStrin
g());

//Devuelveunenteroconlaposicindelaconstantesegn
estdeclarada.
System.out.println("delantero.ordinal()="+delantero.ordina
l());

//Comparaelenumconelparmetrosegnelordenenelque
estndeclaradaslasconstantes.
System.out.println("delantero.compareTo(portero)="+delanter
o.compareTo(defensa));
System.out.println("delantero.compareTo(delantero)="+delante
ro.compareTo(delantero));

//Recorretodaslasconstantesdelaenumeracin
for(Demarcaciond:Demarcacion.values()){

System.out.println(d.toString()+"");
}

Tenemoscomosalidalossiguientesresultados:

delantero.name()=DELANTERO
defensa.toString()=DEFENSA
delantero.ordinal()=3
delantero.compareTo(defensa)=2
delantero.compareTo(delantero)=0
PORTERODEFENSACENTROCAMPISTADELANTERO

Comoyasehadichounenumesunaclaseespecialquelimitalacreacindeobjetosalos
especificadosensuclase(poresosuconstructoresprivado,comoseveenelsiguientefragmento
de cdigo) pero estos objetos pueden tener atributos como cualquier otra clase. En la siguiente
declaracindelaclase,vemosunejemploenlaquedefinimosunenumeradoEquipoquevaatener
dosatributoselnombreyelpuestoenelquequedaronenlaligadelao2009/2010.
publicenumEquipo
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 2/6

22/3/2015

Enum(Enumerados)enJava,conejemplosJarroba

d",2),

BARA("FCBarcelona",1),REAL_MADRID("RealMadri
SEVILLA("SevillaFC",4),VILLAREAL("Villareal",7);
privateStringnombreClub;
privateintpuestoLiga;
privateEquipo(StringnombreClub,intpuestoLiga){

this.nombreClub=nombreClub;

this.puestoLiga=puestoLiga;
}

publicStringgetNombreClub(){

returnnombreClub;
}

publicintgetPuestoLiga(){

returnpuestoLiga;
}

Como se ve BARA, REAL_MADRID, etc. son el nombre del enumerado (u objetos de la


clase Equipo) que tendrn como atributos el nombreClub y puestoLiga. Como se ve en la
clasedefinimos un constructor que es privado (es decir que solo es visible dentro de la clase
Equipo)ysolodefinimoslosmtodosget.Paratrabajarconlosatributosdeestosenumeradosse
hace de la misma manera que con cualquier otro objeto se instancia un objeto y se accede a los
atributosconlosmtodosget.Enelsiguientefragmentodecdigovamosavercomotrabajarcon
enumeradosquetienenatributos:
//Instanciamoselenumerado
Equipovillareal=Equipo.VILLAREAL;

//DevuelveunStringconelnombredelaconstante
System.out.println("villareal.name()="+villareal.name());

//Devuelveelcontenidodelosatributos
System.out.println("villareal.getNombreClub()="+villareal.ge
tNombreClub());
System.out.println("villareal.getPuestoLiga()="+villareal.ge
tPuestoLiga());

Comosalidadeestefragmentodecdigotenemoslosiguiente:

villareal.name()=VILLAREAL
villareal.getNombreClub()=Villareal
villareal.getPuestoLiga()=7

data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 3/6

22/3/2015

Enum(Enumerados)enJava,conejemplosJarroba

Es muy importante que tengis claro que los enumerado no son Strings (aunque pueden
serlo), sino que son objeto de una clase que solo son instanciables desde la clase que se
implementayquenosepuedecrearunobjetodeesaclasedesdecualquierotroladoquenosea
dentro de esa clase. Es muy comn (sobre todo cuando se esta aprendiendo que son los
enumerados)queseinterpretequeunenumeradoesunalistafinitadeStringsyenrealidadesuna
lista finita de objetos de una determinada clase con sus atributos, constructor y mtodos getter
aunqueestosseanprivados.
A continuacin vamos a poner un sencillo ejemplo en el que vamos a mezclar los dos
enumerados anteriores (Demarcacin y Equipo). En este ejemplo (siguiendo la lnea de ejemplo
puestosenlasentradasdeHerencia,PolimorfismoyPolimorfismoII)vamosacrearnosunosobjetos
de la clase Futbolista, que representarn a los jugadores de la seleccin espaola de ftbol que
ganaron el mundial de ftbol de Sudfrica en el ao 2010. Esta clase va a caracterizar a los
futbolistas por su nombre, su dorsal, la demarcacin en la que juegan y el club de ftbol al que
pertenecentalycomovemosenelsiguientediagramadeclases.

ComovemoslosatributosdedemarcacinyequiposondelaclaseDemarcacionyEquipo
respectivamente y son los enumerados vistos anteriormente por tanto un futbolista solo podr
perteneceraunodeloscuatroequiposqueformanelenumeradoEquipoypodrjugarenalgunade
las cuatro demarcaciones que forman el enumerado Demarcacin. A continuacin mostramos la
implementacindelaclaseFutbolista:
packageMain;
publicclassFutbolista{

privateintdorsal;
privateStringNombre;
privateDemarcaciondemarcacion;

data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 4/6

22/3/2015

Enum(Enumerados)enJava,conejemplosJarroba

privateEquipoequipo;

publicFutbolista(){
}

publicFutbolista(Stringnombre,intdorsal,Demarcac
iondemarcacion,Equipoequipo){

this.dorsal=dorsal;

Nombre=nombre;

this.demarcacion=demarcacion;

this.equipo=equipo;

//Metodosgetterysetter

................................

@Override

publicStringtoString(){

returnthis.dorsal+""+this.Nombre+"
"

+this.demarcacion.name()+"
"+this.equipo.getNombreClub();

}
}

Dada esta clase podemos crearnos ya objetos de la clase futbolista, como mostramos a
continuacin:
Futbolistacasillas=newFutbolista("Casillas",1,Demarcaci
on.PORTERO,Equipo.REAL_MADRID);
Futbolistacapdevila=newFutbolista("Capdevila",11,Demarc
acion.DEFENSA,Equipo.VILLAREAL);
Futbolistainiesta=newFutbolista("Iniesta",6,Demarcacio
n.CENTROCAMPISTA,Equipo.BARA);
Futbolistanavas=newFutbolista("Navas",22,Demarcacion.DE
LANTERO,Equipo.SEVILLA);

Comovemoslademarcacinyelequipoalquepertenecensolopuedenserlosdeclarados
enlaclaseenumerado.SillamamosalmtodotoString()declaradoenlaclasefutbolista,podemos
imprimirporpantallalosdatosdelosfutbolistas.Dadoelsiguientecdigo:
System.out.println(casillas.toString());
System.out.println(capdevila.toString());
System.out.println(iniesta.toString());
System.out.println(navas.toString());

YdadoelsiguientemtodotoString()

data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 5/6

22/3/2015

Enum(Enumerados)enJava,conejemplosJarroba

@Override
publicStringtoString(){

returnthis.dorsal+""+this.Nombre+""

+this.demarcacion.name()+""+t
his.equipo.getNombreClub();
}

Tenemoscomosalidalosiguiente:

1CasillasPORTERORealMadrid
11CapdevilaDEFENSAVillareal
6IniestaCENTROCAMPISTAFCBarcelona
22NavasDELANTEROSevillaFC

EnresumenestoestodoloimportantequedebessabersobrelosenumeradosenJava.En
otros lenguajes de programacin los enumerados pueden tener ms mtodos heredados, pero el
conceptofundamentaldeunenumeraesquesonunosobjetos(ynoStringsaunqueessienjavaun
Stringesunclaseynoundatoatmico)definidosenlamismaclaseconconstructorprivadoysi
tieneatributosestossolotienenquetenermtodosgetterparaobtenerelvalordelatributo.

data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 6/6