mixins en java y java8 !sí, es posible!

6
Entra en Adictos a través de Entrar Email Contraseña Registrarme Olvidé mi contraseña Inicio Quiénes somos Formación Comparador de salarios Nuestros libros Más » Estás en: Inicio Tutoriales Mixins en Java y Java8 !Sí, es posible! Síguenos a través de: Catálogo de servicios Autentia Últimas Noticias » 2015: ¡Volvemos a la oficina! » Curso JBoss de Red Hat » Si eres el responsable o líder técnico, considérate desafortunado. No puedes culpar a nadie por ser gris » Portales, gestores de contenidos documentales y desarrollos a medida » Comentando el libro Start up Nation, La historia del milagro económico de Israel, de Dan Senor & Salu Singer Histórico de noticias Últimos Tutoriales » ByteCode: ¿Sabes lo que realmente programas en Java? » Pop Art al estilo Andy Ver todos los tutoriales del autor Alejandro Pérez García Alejandro es socio fundador de Autentia y nuestro experto en J2EE, Linux y optimización de aplicaciones empresariales. Ingeniero en Informática y Certified ScrumMaster Seguir a @alejandropgarci 1,145 seguidores Si te gusta lo que ves, puedes contratarle para darte ayuda con soporte experto, impartir cursos presenciales en tu empresa o para que realicemos tus proyectos como factoría (Madrid). Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación. Fecha de publicación del tutorial: 20150306 Tutorial visitado 1.430 veces Descargar en PDF Mixins en Java y Java8 !Sí, es posible! Creación: 20–02–2015 Índice de contenidos 1. Introducción 2. Entorno 3. Java Mixin, la implementación manual 4. Java Mixin, en runtime, gracias a un proxy dinámico 4.1. Ejemplo de uso de la librería javamixins 4.2. La clave de la librería javamixins 5. Java Mixin con Java 8 6. Conclusiones 7. Sobre el autor 1. Introducción Un Mixin es una forma de incluir métodos de una clase en otra, sin que exista relación de herencia entre ellas. En cierto sentido se puede ver como una especie de “herencia” múltiple, pero sin existir relación de especialización entre las clases. De esta definición la parte más importante es la de que no existe relación de herencia, ya que, si bien el lenguaje Java no soporta directamente los mixins, es precisamente esta falta de relación de herencia la que nos va a permitir implementarlos (si fuera necesaria una relación de herencia entonces sí que sería totalmente imposible implementarlo en Java, ya que Java sólo permite herencia simple). Antes de seguir avanzando vamos a definir un poco más que es un mixin, comparándolo con una interfaz y un trait: Interfaz sólo tiene definición de métodos Trait tiene definición de métodos + implementación de los mismos Mixin tiene definición de métodos + implementación + estado Aquí vemos otro aspecto importante de los mixins, y es que pueden tener estado. Es decir, las clases que vamos a usar para componer el mixin pueden tener atributos que serán “añadidos” al mixin. TITULOS UNIVERSITARIOS Estudia tu carrera en línea, Obtén tu Titulo sin asist

Upload: ben-avraham

Post on 27-Sep-2015

223 views

Category:

Documents


2 download

DESCRIPTION

tip

TRANSCRIPT

  • 16/4/2015 MixinsenJavayJava8!S,esposible!

    http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins 1/6

    EntraenAdictosatravsde

    Entrar

    Email

    ContraseaRegistrarme

    Olvidmicontrasea

    Inicio Quinessomos Formacin Comparadordesalarios Nuestroslibros Ms

    Estsen:Inicio Tutoriales MixinsenJavayJava8!S,esposible!

    Sguenosatravsde:

    CatlogodeserviciosAutentia

    ltimasNoticias

    2015:Volvemosalaoficina!

    CursoJBossdeRedHat

    Siereselresponsableoldertcnico,considratedesafortunado.Nopuedesculparanadieporsergris

    Portales,gestoresdecontenidosdocumentalesydesarrollosamedida

    ComentandoellibroStartupNation,LahistoriadelmilagroeconmicodeIsrael,deDanSenor&SaluSinger

    Histricodenoticias

    ltimosTutoriales

    ByteCode:SabesloquerealmenteprogramasenJava?

    PopArtalestiloAndy

    Vertodoslostutorialesdelautor

    AlejandroPrezGarca

    AlejandroessociofundadordeAutentiaynuestroexpertoenJ2EE,Linuxyoptimizacindeaplicacionesempresariales.

    IngenieroenInformticayCertifiedScrumMaster

    Seguira@alejandropgarci 1,145seguidores

    Sitegustaloqueves,puedescontratarleparadarteayudaconsoporteexperto,impartircursospresencialesentuempresaoparaquerealicemostusproyectoscomofactora(Madrid).PuedesencontrarmeenAutentia:Ofrecemosserviciosdesoporteadesarrollo,factorayformacin.

    Fechadepublicacindeltutorial:20150306 Tutorialvisitado1.430vecesDescargarenPDF

    MixinsenJavayJava8!S,esposible!

    Creacin:20022015

    ndicedecontenidos1.Introduccin2.Entorno3.JavaMixin,laimplementacinmanual4.JavaMixin,enruntime,graciasaunproxydinmico4.1.Ejemplodeusodelalibrerajavamixins4.2.Laclavedelalibrerajavamixins5.JavaMixinconJava86.Conclusiones7.Sobreelautor

    1.IntroduccinUnMixinesunaformadeincluirmtodosdeunaclaseenotra,sinqueexistarelacindeherenciaentreellas.Enciertosentidosepuedevercomounaespeciedeherenciamltiple,perosinexistirrelacindeespecializacinentrelasclases.

    Deestadefinicinlapartemsimportanteesladequenoexisterelacindeherencia,yaque,sibienellenguajeJavanosoportadirectamentelosmixins,esprecisamenteestafaltaderelacindeherencialaquenosvaapermitirimplementarlos(sifueranecesariaunarelacindeherenciaentoncessqueseratotalmenteimposibleimplementarloenJava,yaqueJavaslopermiteherenciasimple).

    Antesdeseguiravanzandovamosadefinirunpocomsqueesunmixin,comparndoloconunainterfazyuntrait:

    InterfazslotienedefinicindemtodosTraittienedefinicindemtodos+implementacindelosmismosMixintienedefinicindemtodos+implementacin+estado

    Aquvemosotroaspectoimportantedelosmixins,yesquepuedentenerestado.Esdecir,lasclasesquevamosausarparacomponerelmixinpuedenteneratributosquesernaadidosalmixin.

    T I T U L O S U N I V E R S I T A R I O S

    Estudia tu carrera en lnea, Obtn tu Titulo sin asist

  • 16/4/2015 MixinsenJavayJava8!S,esposible!

    http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins 2/6

    Warhol:Photoshop

    Tcnicasderealizacindeentrevistas

    ImprimiendodocumentosOfficeyPDFexistentesconJavaenentornoWindows.Batch&Print

    Enfrntateconxitoalacrisisdelahojaenblanco

    ltimosTutorialesdelAutor

    CmohacertestingautomticodeunappletJava

    PrimerospasosconClojure:LeiningenyMidje

    CmointegrarenGradleunservidorJettyoTomcat

    Kettlenoesunatetera,eslaherramientadeETLdePentaho!

    Creatodounentornodemquinasvirtualesconunsolocomando,graciasaVagrant

    2.EntornoEltutorialestescritousandoelsiguienteentorno:

    Hardware:PorttilMacBookPro15(2.3GHzInteli7,16GB1600MhzDDR3,500GBFlashStorage).

    NVIDIAGeForceG7750M

    SistemaOperativo:MacOSXLion10.10.2

    JavaVirtualMachine(JVM)7y8

    3.JavaMixin,laimplementacinmanualSinoexisterelacindeherenciapodemosverunmixincomounaespeciedecomponsicinydelegacin:

    JavaMixinmanual

    VemoscomolaclaseMixtureeslamezcladeextenderlaclaseOriginaleimplementarlainterfazMixin,delegandolaimplmentacinyejecucindelosmtodosdeestainterfazenlaclaseMixinDelegate.MixinDelegateeslaclasequeestamosinclullendoenlaOriginalamododemixin.

    Encdigopuedequedaralgosimilara:

    Enesteejemplocabedestacarcomoenlaslneas3233estamosusandotantolosmtodosdeOriginalcomolosdeMixin,asquepodemosdecirquehemosconseguidoelefectoquedesebamos.

    123456789

    1011121314151617181920212223242526272829303132333435

    classOriginal{privateintfoo=42;publicintgetFoo(){returnfoo;}}interfaceMixin{voidprint();}classMixinDelegateimplementsMixin{privatefinalObjectoriginal;MixinDelegate(Objectoriginal){this.original=original;}@Overridepublicvoidprint(){System.out.println(original.getFoo());}}classMixtureextendsOriginalimplementsMixin{privatefinalMixinmixin=newMixinDelegate(this);@Overridepublicvoidprint(){mixin.print();}}classMain{publicstaticfinalmain(String[]args){Mixturemixture=newMixture();mixture.getFoo();mixture.print();}}

  • 16/4/2015 MixinsenJavayJava8!S,esposible!

    http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins 3/6

    Estaimplementacintienedosgrandesproblemas:

    1. SilainterfazMixintienemuchosmtodos,vamosatenermuchocdigoduplicadoenlaclaseMixture(comoeldelaslneas23a26),ademsdequelovamosatenerquecopiarencadanuevaclasemezclaquequeramoshacer.

    2. Paracadamezclatenemosquecrearunanuevaclase(comolaclaseMixture)quetienequeconocerlosmixinsquelequeremosaplicaraloriginal(lneas21y25).Esdecir,haydemasiadoacoplamientoentreelmixinylaclaseoriginaldondeseestnincluyendolosmtodos.

    4.JavaMixin,enruntime,graciasaunproxydinmicoHecreadounapequealibreraque,utilizandoslolosmecanismosqueproporcionaJava,nospermiterealizarmixturesenruntimeysinperdereltipadofuerte,corrigiendo,adems,losdosproblemasquecomentbamosenelapartadoanterior.Esdecirnotenemosqueescribircdigorepetitivoysobretodo,laclaseoriginalyelmixinnoseconocendenada.

    LalibreraJavaMixinlapodsencontrarenelGitHubdedeAutentia.

    Elsiguientediagramarepresentaelejemploquevamosautilizar:

    Igualqueenelapartadoanteriorvemoscomounmixinsecomponedeunainterfazyunaclasequeimplementalosmtodosdeestaysobrelaque,laclaseoriginal,delegarlaejecucin.Asenelejemplopodemosidentificardosmixins:

    Entity,formadoporlainterfazEntityylaclasedelegadoEntityDelegate.MixtureInspector,formadoporlainterfazMixtureInspectorylaclasedelegadoMixtureInspectorDelegate.

    Eneldiagramavemoscomoalfinal,elProxydinmicopoweredPersoncumplirlasinterfacesdePerson,EntityyMixtureInspector,porloquesobreesteobjetopodremosllamaracualquiermtododeestasinterfaces.

    4.1.Ejemplodeusodelalibrerajavamixins

    Perotranquilosporqueaunqueparececomplicado,lalibreraquehepreparadovaahacerqueelusoseamuysencillo.Vemosloconunejemplodeuso:

    Enestecdigopodemoshacerlossiguietnescomentarios:

    lnea1creamoselobjetodondequeremosaplicarlosmixins.Esunacreacinnormal,dehecholapodramoshaberhechodirectamenteenlalnea7,perohepreferidosepararlaenunavariablelocalparaquequedemsclaroquesetratadelobjetooriginal.lnea3creamoselMixerBuilderindicandoeltipodelosmixturesquedevolverelMixer.lnea4y5creamoslosMixinylosincluimosenelMixinBuilder.Aququedaclarocomocadamixinesunaparejadeinterfazmsunaclasedelegadaqueimplementalosmtodos.lnea6construimoselMixer.lnea7ledecimosalMixersobrequeinstanciaqueremosaplicarlosmixins.

    YaquehemosseparadolaconstruccindelMixerdelaconstruccindelasmixtures(mezcladelobjetooriginalmslosmixins),podemoscachearfcilmenteelMixerparareutilizarloenlaconstruccindemuchosmixtures.Veamosun

    1234567

    finalPersonoriginalPerson=newSimplePerson("John","Doe");finalPersonperson=newMixerBuilder(Person.class).include(newMixin(Entity.class,EntityDelegate.class)).include(newMixin(MixtureInspector.class,MixtureInspectorDelegate.class)).build().mixWith(originalPerson);

    ?

  • 16/4/2015 MixinsenJavayJava8!S,esposible!

    http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins 4/6

    ejemplo:

    Enlostestsdelalibrerasepuedenencontrarmsejemplosdeuso.

    4.2.Laclavedelalibrerajavamixins

    Osanimoaqueechisunvistazoatodoelcdigo,peropodramosdecirqueelquiddelacuestinestenelmtodoprivadocreateProxydelaclaseMixer:

    AquvemoscomoseestcreandounProxydinmicocuyoInvocationHandlerloquehacees:

    lnea5buscarenunmapaeldelegadoquecorrespondeconeltipodondeestdefinidoelmtodoqueseestejecutando.lnea7sinoencuentraundelegaodsuponequeelmtodopertenecealobjetooriginal.lnea10ejecutaelmtodo(bieneneldelegadooenelobjetooriginal).

    5.JavaMixinconJava8Java8introduceunanuevaconstruccinenellenguajequepermiteespecificarunaimplementacinpordefectoparamtodosdeunainterfaz.

    SegnOracleelprincipalobjetivodeestasimplementacionespordefectoeslademantenerlacompatibilidadhaciaatrsalaadirnuevosmtodosaunainterfazampliamenteusada(comohaceelpropioJavacontodoelAPIdecoleccionesparasoportarLambdasyStreams).Demaneraquealaadirestosnuevosmtodosnoserompatodoelcdigoqueyaestescrito(antesdeJava8siaadimosunmtodoaunainterfazexistente,todaslasclasesqueusanesainterfazdejarndecompilar).

    Nosotrosvamosaaprovecharestacapacidadparahacerunaimplementacindemixin.Estaimplementacintendrelmismoproblemadealtoacoplamientoquepresentabaenelprimerpuntodeestetutorial,cuandohacamoslosmixinsamanoperoporlomenosnotendremoselproblemadeladuplicacindecdigo.

    Dehechorealmenteloqueestamosimplementando,talcomocuentaelartculoJava8:NowYouHaveMixins?,eselVirutalFieldPattern.

    Elejemploquevamosausares:

    123456789

    10

    //BuildstheFactoryjustonetimefinalMixermixer=newMixerBuilder(PoweredPerson.class).include(newMixin(Entity.class,EntityDelegate.class)).include(newMixin(MixtureInspector.class,MixtureInspectorDelegate.class)).build();//Buildsallthemixturesthatyouwant!finalPoweredPersonpoweredPerson1=mixer.mixWith(newSimplePerson("John","Doe"));finalPoweredPersonpoweredPerson2=mixer.mixWith(newSimplePerson("Jane","Doe"));finalPoweredPersonpoweredPerson3=mixer.mixWith(newSimplePerson("Joe","Public"));

    123456789

    1011121314

    privateObjectcreateProxy(finalObjectoriginal,finalMap

  • 16/4/2015 MixinsenJavayJava8!S,esposible!

    http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins 5/6

    Java8Mixin

    Elcdigosera:

    AquelquiddelacuestinestenlainterfazEntityFlavour(lneas9a14)EstainterfazaadeelmtodogetEntity(),queobligaaquienloimplementeaproporcionarunEntity,yluegosobreescribetodoslosmtodosdelainterfazEntityproporcionandounaimplementacinpordefectoenfuncindeesemtodo.EsdecirproporcionaunaimplementacinpordefectoquedelegalaejecucindelmtodosobrelainstanciadevueltaporgetEntity().

    GraciasalainterfazEntityFlavourysusimplementacionespordefecto,yanotenemosquerepetircdigobastaconquelasclasesdondequeremosaplicarelmixinimplementenestainterfaz(lneas26a32).

    123456789

    1011121314151617181920212223242526272829303132333435363738394041

    classSimplePerson{...}interfaceEntity{voidsave();}interfaceEntityFlavourextendsEntity{EntitygetEntity();@Overridedefaultvoidsave(){getEntity().save();}}classEntityDelegateimplementsEntity{privatefinalObjectoriginal;EntityDelegate(Objectoriginal){this.original=original;}@Overridepublicvoidsave(){...}}classPoweredPersonextendsSimplePersonimplementsEntityFlavour{privatefinalEntityDelegatemixin=newMixinDelegate(this);@OverridepublicEntitygetEntity(){returnmixin;}}classMain{publicstaticfinalmain(String[]args){PoweredPersonmixture=newPoweredPerson();mixture.getFoo();mixture.save();}}

    ?

  • 16/4/2015 MixinsenJavayJava8!S,esposible!

    http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins 6/6

    EstaobraestlicenciadabajolicenciaCreativeCommonsdeReconocimientoNocomercialSinobrasderivadas2.5

    IMPULSA Impulsores Comunidad Ayuda?

    60clicks + + + + + +

    2personashantradoclicksaestapgina

    poweredbykarmacracy

    Share | 0

    Registrateyaccedeaestayotrasventajas

    AnmateycomntanosloquepiensessobreesteTUTORIAL:

    6.ConclusionesEstetutorialnopretendesermsqueunejercicioterico,ynosesilalibrerajavamixinsllegarmuylejosotendrutilidadreal.Perosmepareceinteresanteelestudiodecomo,medianteelusodepatrones,podemosimplementarcaractersticaquenuestrolenguajenosoportadeformanativa.

    OsanimoaquerevisiselcdigodelproyectoaunquesloseacomoejerciciopararepasarcomofuncionaunProxydinmicoenJava.

    Nota:TodaslosdiagramasUMLhansidogeneradosconyUML.

    7.SobreelautorAlejandroPrezGarca,IngenieroenInformtica(especialidaddeIngenieradelSoftware)yCertifiedScrumMaster

    SociofundadordeAutentia(Desarrollodesoftware,Consultora,Formacin)

    mailto:[email protected]

    AutentiaRealBusinessSolutionsS.L.SoporteaDesarrollo

    http://www.autentia.com

    Acontinuacinpuedesevaluarlo:

    Regstrateparaevaluarlo

    Porfavor,vota+1ocomprtelositepareciinteresante

    Copyright20032015AllRightsReserved|Textolegalycondicionesdeuso|Banners|PoweredbyAutentia|Contacto