mixins en java y java8 !sí, es posible!
DESCRIPTION
tipTRANSCRIPT
-
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