Anda di halaman 1dari 6

16/4/2015

MixinsenJavayJava8!S,esposible!
EntraenAdictosatravsde

Email
Contrasea
Registrarme
Olvidmicontrasea

Entrar

Inicio

Quinessomos

Formacin

Comparadordesalarios

Nuestroslibros

Ms

Estsen:Inicio Tutoriales MixinsenJavayJava8!S,esposible!

AlejandroPrezGarca
AlejandroessociofundadordeAutentiaynuestroexpertoenJ2EE,Linuxy
optimizacindeaplicacionesempresariales.

Catlogodeservicios
Autentia

IngenieroenInformticayCertifiedScrumMaster
Seguira@alejandropgarci

1,145seguidores

Sitegustaloqueves,puedescontratarleparadarteayudaconsoporteexperto,
impartircursospresencialesentuempresaoparaquerealicemostusproyectos
comofactora(Madrid).
PuedesencontrarmeenAutentia:Ofrecemosserviciosdesoporteadesarrollo,
factorayformacin.
Vertodoslostutorialesdelautor

TITULOS

UNIVERSITARIOS

Estudia tu carrera en lnea, Obtn tu Titulo sin asist

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

Anda mungkin juga menyukai