Enum (Enumerados) en Java, Con Ejemplos - Jarroba

6

Click here to load reader

description

Enumerados

Transcript of Enum (Enumerados) en Java, Con Ejemplos - Jarroba

  • 22/3/2015 Enum(Enumerados)enJava,conejemplosJarroba

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

    Enum(Enumerados)enJava,conejemplos

    ElproyectodeestepostlopuedesdescargarpulsandoAQUI.

    Un enumerado (o Enum) es una clase especial (tanto en Java como en otroslenguajes) que limitan la creacin de objetos a los especificados explcitamente en laimplementacinde laclase.Lanica limitacinque tienen losenumerados respectoaunaclasenormalesquesitieneconstructor,estedebedeserprivadoparaquenosepuedancrearnuevosobjetos.

    VamosaempezarconunsencilloejemplosobreunaclaseEnum.Volviendoa losejemplorelacionadosconelftbol,tenemosquelofutbolistasestncaracterizadosporunademarcacinalahoradejugarunpartidodeftbol,portantolasdemarcacionesenlasquepuedejugarunfutbolistasonfinitasyportantosepuedenenumeraren:Portero,Defensa,CentrocampistayDelantero.ConestaespecificacinpodemoscrearnoslasiguienteclaseEnumllamadaDemarcacin:

    publicenumDemarcacion{PORTERO,DEFENSA,CENTROCAMPISTA,DELANTERO}

    Porconvenio(aunquelopodisponercomoqueris)losnombresdelosenumeradosseescribenenmaysculas.

    EsmuyimportanteentenderqueunEnumenjavaesrealmenteunaclase(cuyosobjetossolopuedenserlosdefinidosenestaclase:PORTERO,,DELANTERO)queheredadelaclaseEnum(java.lang.Enum)yportantolosenumeradostienenunaseriedemtodosheredadosdeesaclasepadre(PulsarAQUIparaversuJavaDoc). Acontinuacinvamosamostraralgunosdelosmtodosmsutilizadosdelosenumerados:

    publicenumDemarcacion{PORTERO,DEFENSA,CENTROCAMPISTA,DELANTERO}Demarcaciondelantero=Demarcacion.DELANTERO;//InstanciadeunenumdelaclaseDemarcacindelantero.name();//DevuelveunStringconelnombredelaconstante(DELANTERO)delantero.toString();//DevuelveunStringconelnombredelaconstante(DELANTERO)delantero.ordinal();//Devuelveunenteroconlaposicindelenumsegnestdeclarada(3).delantero.compareTo(Enumotro);//Comparaelenumconel

    http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.htmlhttps://github.com/jarroba/enumJava_Jarroba

  • 22/3/2015 Enum(Enumerados)enJava,conejemplosJarroba

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

    parmetrosegnelordenenelqueestndeclaradosloenumDemarcacion.values();//Devuelveunarrayquecontienetodoslosenum

    Vistocualessonlosmtodosmsutilizadosdentrodelosenumerados,vamosaponerunejemploparaverlosresultadosquenosdevuelvenestosmtodos.Dadoelsiguientefragmentodecdigo:

    Demarcaciondelantero=Demarcacion.DELANTERO;Demarcaciondefensa=Demarcacion.DEFENSA; //DevuelveunStringconelnombredelaconstanteSystem.out.println("delantero.name()="+delantero.name());System.out.println("defensa.toString()="+defensa.toString()); //Devuelveunenteroconlaposicindelaconstantesegnestdeclarada.System.out.println("delantero.ordinal()="+delantero.ordinal()); //Comparaelenumconelparmetrosegnelordenenelqueestndeclaradaslasconstantes.System.out.println("delantero.compareTo(portero)="+delantero.compareTo(defensa));System.out.println("delantero.compareTo(delantero)="+delantero.compareTo(delantero)); //Recorretodaslasconstantesdelaenumeracinfor(Demarcaciond:Demarcacion.values()){ System.out.println(d.toString()+"");}

    Tenemoscomosalidalossiguientesresultados:

    delantero.name()=DELANTEROdefensa.toString()=DEFENSAdelantero.ordinal()=3delantero.compareTo(defensa)=2delantero.compareTo(delantero)=0PORTERODEFENSACENTROCAMPISTADELANTERO

    Comoyasehadichounenumesunaclaseespecialquelimitalacreacindeobjetosalosespecificadosensuclase(poresosuconstructoresprivado,comoseveenelsiguientefragmentode cdigo) pero estos objetos pueden tener atributos como cualquier otra clase. En la siguientedeclaracindelaclase,vemosunejemploenlaquedefinimosunenumeradoEquipoquevaatenerdosatributoselnombreyelpuestoenelquequedaronenlaligadelao2009/2010.

    publicenumEquipo

  • 22/3/2015 Enum(Enumerados)enJava,conejemplosJarroba

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

    { BARA("FCBarcelona",1),REAL_MADRID("RealMadrid",2), SEVILLA("SevillaFC",4),VILLAREAL("Villareal",7); privateStringnombreClub; privateintpuestoLiga; privateEquipo(StringnombreClub,intpuestoLiga){ this.nombreClub=nombreClub; this.puestoLiga=puestoLiga; }

    publicStringgetNombreClub(){ returnnombreClub; }

    publicintgetPuestoLiga(){ returnpuestoLiga; }}

    ComoseveBARA,REAL_MADRID,etc.sonelnombredelenumerado (uobjetosde laclase Equipo) que tendrn como atributos el nombreClub y puestoLiga. Como se ve en laclasedefinimosunconstructorqueesprivado (esdecirquesoloesvisibledentrode laclaseEquipo)ysolodefinimoslosmtodosget.Paratrabajarconlosatributosdeestosenumeradossehacede lamismamaneraqueconcualquierotroobjetose instanciaunobjetoyseaccedea losatributosconlosmtodosget.Enelsiguientefragmentodecdigovamosavercomotrabajarconenumeradosquetienenatributos:

    //InstanciamoselenumeradoEquipovillareal=Equipo.VILLAREAL; //DevuelveunStringconelnombredelaconstanteSystem.out.println("villareal.name()="+villareal.name()); //DevuelveelcontenidodelosatributosSystem.out.println("villareal.getNombreClub()="+villareal.getNombreClub());System.out.println("villareal.getPuestoLiga()="+villareal.getPuestoLiga());

    Comosalidadeestefragmentodecdigotenemoslosiguiente:

    villareal.name()=VILLAREALvillareal.getNombreClub()=Villarealvillareal.getPuestoLiga()=7

  • 22/3/2015 Enum(Enumerados)enJava,conejemplosJarroba

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

    Esmuy importante que tengis claro que los enumerado no son Strings (aunque puedenserlo), sino que son objeto de una clase que solo son instanciables desde la clase que seimplementayquenosepuedecrearunobjetodeesaclasedesdecualquierotro ladoquenoseadentro de esa clase. Es muy comn (sobre todo cuando se esta aprendiendo que son losenumerados)queseinterpretequeunenumeradoesunalistafinitadeStringsyenrealidadesunalista finita de objetos de una determinada clase con sus atributos, constructor y mtodos getteraunqueestosseanprivados.

    A continuacin vamos a poner un sencillo ejemplo en el que vamos a mezclar los dosenumerados anteriores (Demarcacin y Equipo). En este ejemplo (siguiendo la lnea de ejemplopuestosenlasentradasdeHerencia,PolimorfismoyPolimorfismoII)vamosacrearnosunosobjetosde la clase Futbolista, que representarn a los jugadores de la seleccin espaola de ftbol queganaron el mundial de ftbol de Sudfrica en el ao 2010. Esta clase va a caracterizar a losfutbolistas por su nombre, su dorsal, la demarcacin en la que juegan y el club de ftbol al quepertenecentalycomovemosenelsiguientediagramadeclases.

    ComovemoslosatributosdedemarcacinyequiposondelaclaseDemarcacionyEquiporespectivamente y son los enumerados vistos anteriormente por tanto un futbolista solo podrperteneceraunodeloscuatroequiposqueformanelenumeradoEquipoypodrjugarenalgunadelascuatrodemarcacionesque formanelenumerado Demarcacin.Acontinuacinmostramos laimplementacindelaclaseFutbolista:

    packageMain;

    publicclassFutbolista{

    privateintdorsal; privateStringNombre; privateDemarcaciondemarcacion;

    http://jarroba.com/herencia-en-la-programacion-orientada-a-objetos-ejemplo-en-java/http://jarroba.com/polimorfismo-en-java-parte-i-con-ejemplos/http://jarroba.com/polimorfismo-en-java-interface-parte-ii-con-ejemplos/http://jarroba.com/wp-content/uploads/2014/09/enum_jarroba.jpg

  • 22/3/2015 Enum(Enumerados)enJava,conejemplosJarroba

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

    privateEquipoequipo;

    publicFutbolista(){ }

    publicFutbolista(Stringnombre,intdorsal,Demarcaciondemarcacion,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, comomostramos acontinuacin:

    Futbolistacasillas=newFutbolista("Casillas",1,Demarcacion.PORTERO,Equipo.REAL_MADRID);Futbolistacapdevila=newFutbolista("Capdevila",11,Demarcacion.DEFENSA,Equipo.VILLAREAL);Futbolistainiesta=newFutbolista("Iniesta",6,Demarcacion.CENTROCAMPISTA,Equipo.BARA);Futbolistanavas=newFutbolista("Navas",22,Demarcacion.DELANTERO,Equipo.SEVILLA);

    Comovemoslademarcacinyelequipoalquepertenecensolopuedenserlosdeclaradosenlaclaseenumerado.SillamamosalmtodotoString()declaradoenlaclasefutbolista,podemosimprimirporpantallalosdatosdelosfutbolistas.Dadoelsiguientecdigo:

    System.out.println(casillas.toString());System.out.println(capdevila.toString());System.out.println(iniesta.toString());System.out.println(navas.toString());

    YdadoelsiguientemtodotoString()

  • 22/3/2015 Enum(Enumerados)enJava,conejemplosJarroba

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

    @OverridepublicStringtoString(){ returnthis.dorsal+""+this.Nombre+"" +this.demarcacion.name()+""+this.equipo.getNombreClub();}

    Tenemoscomosalidalosiguiente:

    1CasillasPORTERORealMadrid11CapdevilaDEFENSAVillareal6IniestaCENTROCAMPISTAFCBarcelona22NavasDELANTEROSevillaFC

    EnresumenestoestodoloimportantequedebessabersobrelosenumeradosenJava.Enotros lenguajes de programacin los enumerados pueden tenermsmtodos heredados, pero elconceptofundamentaldeunenumeraesquesonunosobjetos(ynoStringsaunqueessienjavaunStringesunclaseynoundatoatmico)definidosenlamismaclaseconconstructorprivadoysitieneatributosestossolotienenquetenermtodosgetterparaobtenerelvalordelatributo.