MixinsenJavayJava8!S,esposible!
EntraenAdictosatravsde
Email
Contrasea
Registrarme
Olvidmicontrasea
Entrar
Inicio
Quinessomos
Formacin
Comparadordesalarios
Nuestroslibros
Ms
AlejandroPrezGarca
AlejandroessociofundadordeAutentiaynuestroexpertoenJ2EE,Linuxy
optimizacindeaplicacionesempresariales.
Catlogodeservicios
Autentia
IngenieroenInformticayCertifiedScrumMaster
Seguira@alejandropgarci
1,145seguidores
Sitegustaloqueves,puedescontratarleparadarteayudaconsoporteexperto,
impartircursospresencialesentuempresaoparaquerealicemostusproyectos
comofactora(Madrid).
PuedesencontrarmeenAutentia:Ofrecemosserviciosdesoporteadesarrollo,
factorayformacin.
Vertodoslostutorialesdelautor
TITULOS
UNIVERSITARIOS
Fechadepublicacindeltutorial:20150306
Tutorialvisitado1.430vecesDescargarenPDF
MixinsenJavayJava8!S,esposible!
Creacin:20022015
ndicedecontenidos
1.Introduccin
2.Entorno
3.JavaMixin,laimplementacinmanual
4.JavaMixin,enruntime,graciasaunproxydinmico
4.1.Ejemplodeusodelalibrerajavamixins
4.2.Laclavedelalibrerajavamixins
5.JavaMixinconJava8
6.Conclusiones
7.Sobreelautor
1.Introduccin
UnMixinesunaformadeincluirmtodosdeunaclaseenotra,sinqueexistarelacindeherenciaentreellas.Encierto
sentidosepuedevercomounaespeciedeherenciamltiple,perosinexistirrelacindeespecializacinentrelas
clases.
Deestadefinicinlapartemsimportanteesladequenoexisterelacindeherencia,yaque,sibienellenguajeJava
nosoportadirectamentelosmixins,esprecisamenteestafaltaderelacindeherencialaquenosvaapermitir
implementarlos(sifueranecesariaunarelacindeherenciaentoncessqueseratotalmenteimposibleimplementarloen
Java,yaqueJavaslopermiteherenciasimple).
Sguenosatravs
de:
ltimasNoticias
2015:Volvemosala
oficina!
CursoJBossdeRedHat
Siereselresponsableo
ldertcnico,considrate
desafortunado.Nopuedes
culparanadieporsergris
Portales,gestoresde
contenidosdocumentalesy
desarrollosamedida
ComentandoellibroStart
upNation,Lahistoriadel
milagroeconmicodeIsrael,
deDanSenor&SaluSinger
Histricodenoticias
Antesdeseguiravanzandovamosadefinirunpocomsqueesunmixin,comparndoloconunainterfazyuntrait:
Interfazslotienedefinicindemtodos
Traittienedefinicindemtodos+implementacindelosmismos
Mixintienedefinicindemtodos+implementacin+estado
Aquvemosotroaspectoimportantedelosmixins,yesquepuedentenerestado.Esdecir,lasclasesquevamosausar
paracomponerelmixinpuedenteneratributosquesernaadidosalmixin.
ltimosTutoriales
ByteCode:Sabesloque
realmenteprogramasen
Java?
PopArtalestiloAndy
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins
1/6
16/4/2015
MixinsenJavayJava8!S,esposible!
2.Entorno
Warhol:Photoshop
Eltutorialestescritousandoelsiguienteentorno:
Tcnicasderealizacinde
entrevistas
Hardware:PorttilMacBookPro15(2.3GHzInteli7,16GB1600MhzDDR3,500GBFlashStorage).
NVIDIAGeForceG7750M
SistemaOperativo:MacOSXLion10.10.2
JavaVirtualMachine(JVM)7y8
3.JavaMixin,laimplementacinmanual
Sinoexisterelacindeherenciapodemosverunmixincomounaespeciedecomponsicinydelegacin:
Imprimiendodocumentos
OfficeyPDFexistentescon
JavaenentornoWindows.
Batch&Print
Enfrntateconxitoala
crisisdelahojaenblanco
ltimosTutorialesdel
Autor
Cmohacertesting
automticodeunappletJava
Primerospasoscon
Clojure:LeiningenyMidje
CmointegrarenGradle
unservidorJettyoTomcat
Kettlenoesunatetera,es
laherramientadeETLde
Pentaho!
Creatodounentornode
mquinasvirtualesconun
solocomando,graciasa
Vagrant
JavaMixinmanual
VemoscomolaclaseMixtureeslamezcladeextenderlaclaseOriginaleimplementarlainterfazMixin,delegandola
implmentacinyejecucindelosmtodosdeestainterfazenlaclaseMixinDelegate.MixinDelegateeslaclaseque
estamosinclullendoenlaOriginalamododemixin.
Encdigopuedequedaralgosimilara:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
classOriginal{
privateintfoo=42;
publicintgetFoo(){returnfoo;}
}
interfaceMixin{
voidprint();
}
classMixinDelegateimplementsMixin{
privatefinalObjectoriginal;
MixinDelegate(Objectoriginal){this.original=original;}
@Override
publicvoidprint(){
System.out.println(original.getFoo());
}
}
classMixtureextendsOriginalimplementsMixin{
privatefinalMixinmixin=newMixinDelegate(this);
@Override
publicvoidprint(){
mixin.print();
}
}
classMain{
publicstaticfinalmain(String[]args){
Mixturemixture=newMixture();
mixture.getFoo();
mixture.print();
}
}
Enesteejemplocabedestacarcomoenlaslneas3233estamosusandotantolosmtodosdeOriginalcomolosde
Mixin,asquepodemosdecirquehemosconseguidoelefectoquedesebamos.
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins
2/6
16/4/2015
MixinsenJavayJava8!S,esposible!
Estaimplementacintienedosgrandesproblemas:
1. SilainterfazMixintienemuchosmtodos,vamosatenermuchocdigoduplicadoenlaclaseMixture(comoel
delaslneas23a26),ademsdequelovamosatenerquecopiarencadanuevaclasemezclaquequeramos
hacer.
2. Paracadamezclatenemosquecrearunanuevaclase(comolaclaseMixture)quetienequeconocerlosmixins
quelequeremosaplicaraloriginal(lneas21y25).Esdecir,haydemasiadoacoplamientoentreelmixinyla
claseoriginaldondeseestnincluyendolosmtodos.
4.JavaMixin,enruntime,graciasaunproxydinmico
Hecreadounapequealibreraque,utilizandoslolosmecanismosqueproporcionaJava,nospermiterealizarmixtures
enruntimeysinperdereltipadofuerte,corrigiendo,adems,losdosproblemasquecomentbamosenelapartado
anterior.Esdecirnotenemosqueescribircdigorepetitivoysobretodo,laclaseoriginalyelmixinnoseconocende
nada.
LalibreraJavaMixinlapodsencontrarenelGitHubdedeAutentia.
Elsiguientediagramarepresentaelejemploquevamosautilizar:
Igualqueenelapartadoanteriorvemoscomounmixinsecomponedeunainterfazyunaclasequeimplementalos
mtodosdeestaysobrelaque,laclaseoriginal,delegarlaejecucin.Asenelejemplopodemosidentificardosmixins:
Entity,formadoporlainterfazEntityylaclasedelegadoEntityDelegate.
MixtureInspector,formadoporlainterfazMixtureInspectorylaclasedelegadoMixtureInspectorDelegate.
Eneldiagramavemoscomoalfinal,elProxydinmicopoweredPersoncumplirlasinterfacesdePerson,Entityy
MixtureInspector,porloquesobreesteobjetopodremosllamaracualquiermtododeestasinterfaces.
4.1.Ejemplodeusodelalibrerajavamixins
Perotranquilosporqueaunqueparececomplicado,lalibreraquehepreparadovaahacerqueelusoseamuysencillo.
Vemosloconunejemplodeuso:
1
2
3
4
5
6
7
finalPersonoriginalPerson=newSimplePerson("John","Doe");
finalPersonperson=newMixerBuilder(Person.class)
.include(newMixin(Entity.class,EntityDelegate.class))
.include(newMixin(MixtureInspector.class,MixtureInspectorDelegate.class))
.build()
.mixWith(originalPerson);
Enestecdigopodemoshacerlossiguietnescomentarios:
lnea1creamoselobjetodondequeremosaplicarlosmixins.Esunacreacinnormal,dehecholapodramos
haberhechodirectamenteenlalnea7,perohepreferidosepararlaenunavariablelocalparaquequedems
claroquesetratadelobjetooriginal.
lnea3creamoselMixerBuilderindicandoeltipodelosmixturesquedevolverelMixer.
lnea4y5creamoslosMixinylosincluimosenelMixinBuilder.Aququedaclarocomocadamixinesuna
parejadeinterfazmsunaclasedelegadaqueimplementalosmtodos.
lnea6construimoselMixer.
lnea7ledecimosalMixersobrequeinstanciaqueremosaplicarlosmixins.
YaquehemosseparadolaconstruccindelMixerdelaconstruccindelasmixtures(mezcladelobjetooriginalmslos
mixins),podemoscachearfcilmenteelMixerparareutilizarloenlaconstruccindemuchosmixtures.Veamosun
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins
3/6
16/4/2015
MixinsenJavayJava8!S,esposible!
ejemplo:
1
2
3
4
5
6
7
8
9
10
//BuildstheFactoryjustonetime
finalMixermixer=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"));
Enlostestsdelalibrerasepuedenencontrarmsejemplosdeuso.
4.2.Laclavedelalibrerajavamixins
Osanimoaqueechisunvistazoatodoelcdigo,peropodramosdecirqueelquiddelacuestinestenelmtodo
privadocreateProxydelaclaseMixer:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
?
privateObjectcreateProxy(finalObjectoriginal,finalMap<Class<?>,Object>delegatesByInterfaceType){
returnproxyClass.createProxy(newInvocationHandler(){
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
ObjectobjectToCall=delegatesByInterfaceType.get(method.getDeclaringClass());
if(objectToCall==null){
objectToCall=original;
}
returnmethod.invoke(objectToCall,args);
}
});
AquvemoscomoseestcreandounProxydinmicocuyoInvocationHandlerloquehacees:
lnea5buscarenunmapaeldelegadoquecorrespondeconeltipodondeestdefinidoelmtodoqueseest
ejecutando.
lnea7sinoencuentraundelegaodsuponequeelmtodopertenecealobjetooriginal.
lnea10ejecutaelmtodo(bieneneldelegadooenelobjetooriginal).
5.JavaMixinconJava8
Java8introduceunanuevaconstruccinenellenguajequepermiteespecificarunaimplementacinpordefectopara
mtodosdeunainterfaz.
1
2
3
4
5
interfaceMessagePrinter{
defaultprintMessage(){
System.out.println("Esteeselmensajepordefecto");
}
}
SegnOracleelprincipalobjetivodeestasimplementacionespordefectoeslademantenerlacompatibilidadhaciaatrs
alaadirnuevosmtodosaunainterfazampliamenteusada(comohaceelpropioJavacontodoelAPIdecolecciones
parasoportarLambdasyStreams).Demaneraquealaadirestosnuevosmtodosnoserompatodoelcdigoqueya
estescrito(antesdeJava8siaadimosunmtodoaunainterfazexistente,todaslasclasesqueusanesainterfaz
dejarndecompilar).
Nosotrosvamosaaprovecharestacapacidadparahacerunaimplementacindemixin.Estaimplementacintendrel
mismoproblemadealtoacoplamientoquepresentabaenelprimerpuntodeestetutorial,cuandohacamoslosmixinsa
manoperoporlomenosnotendremoselproblemadeladuplicacindecdigo.
Dehechorealmenteloqueestamosimplementando,talcomocuentaelartculoJava8:NowYouHaveMixins?,esel
VirutalFieldPattern.
Elejemploquevamosausares:
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins
4/6
16/4/2015
MixinsenJavayJava8!S,esposible!
Java8Mixin
Elcdigosera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
classSimplePerson{
...
}
interfaceEntity{
voidsave();
}
interfaceEntityFlavourextendsEntity{
EntitygetEntity();
@Override
defaultvoidsave(){getEntity().save();}
}
classEntityDelegateimplementsEntity{
privatefinalObjectoriginal;
EntityDelegate(Objectoriginal){this.original=original;}
@Override
publicvoidsave(){
...
}
}
classPoweredPersonextendsSimplePersonimplementsEntityFlavour{
privatefinalEntityDelegatemixin=newMixinDelegate(this);
@Override
publicEntitygetEntity(){
returnmixin;
}
}
classMain{
publicstaticfinalmain(String[]args){
PoweredPersonmixture=newPoweredPerson();
mixture.getFoo();
mixture.save();
}
}
AquelquiddelacuestinestenlainterfazEntityFlavour(lneas9a14)Estainterfazaadeelmtodo
getEntity(),queobligaaquienloimplementeaproporcionarunEntity,yluegosobreescribetodoslosmtodosdela
interfazEntityproporcionandounaimplementacinpordefectoenfuncindeesemtodo.Esdecirproporcionauna
implementacinpordefectoquedelegalaejecucindelmtodosobrelainstanciadevueltaporgetEntity().
GraciasalainterfazEntityFlavourysusimplementacionespordefecto,yanotenemosquerepetircdigobastacon
quelasclasesdondequeremosaplicarelmixinimplementenestainterfaz(lneas26a32).
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins
5/6
16/4/2015
MixinsenJavayJava8!S,esposible!
6.Conclusiones
Estetutorialnopretendesermsqueunejercicioterico,ynosesilalibrerajavamixinsllegarmuylejosotendr
utilidadreal.Perosmepareceinteresanteelestudiodecomo,medianteelusodepatrones,podemosimplementar
caractersticaquenuestrolenguajenosoportadeformanativa.
OsanimoaquerevisiselcdigodelproyectoaunquesloseacomoejerciciopararepasarcomofuncionaunProxy
dinmicoenJava.
Nota:TodaslosdiagramasUMLhansidogeneradosconyUML.
7.Sobreelautor
AlejandroPrezGarca,IngenieroenInformtica(especialidaddeIngenieradelSoftware)yCertifiedScrumMaster
SociofundadordeAutentia(Desarrollodesoftware,Consultora,Formacin)
mailto:alejandropg@autentia.com
AutentiaRealBusinessSolutionsS.L.SoporteaDesarrollo
http://www.autentia.com
Acontinuacinpuedesevaluarlo:
Regstrateparaevaluarlo
Porfavor,vota+1ocomprtelositepareciinteresante
Share |
AnmateycomntanosloquepiensessobreesteTUTORIAL:
Registrateyaccedeaestayotrasventajas
EstaobraestlicenciadabajolicenciaCreativeCommonsdeReconocimientoNocomercialSinobrasderivadas2.5
IMPULSA
60
clicks
Impulsores
Comunidad
Ayuda?
2personashantradoclicksaestapgina
poweredbykarmacracy
Copyright20032015AllRightsReserved|Textolegalycondicionesdeuso|Banners|PoweredbyAutentia|Contacto
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=javamixins
6/6