Interface en Java 8 -Metodo Default- Con Ejemplos - Jarroba
-
Upload
fcaballerog -
Category
Documents
-
view
59 -
download
7
description
Transcript of Interface en Java 8 -Metodo Default- Con Ejemplos - Jarroba
-
22/3/2015 InterfaceenJava8MetodoDefaultconejemplosJarroba
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 1/8
nterfaceenJava8MetodoDefaultconejemplos
ElproyectodeestepostlopuedesdescargarpulsandoAQUI.
EnestaentradavamosahahablardeuncambiobastanteinteresantequehanintegradoenJava8,comoeselmtododefaultdelasnuevasinterfaces.
Como ya se comento en las entradas en las que hablamos depolimorfismo, una claseinterfacees unaclaseabstractapuraen laque todossusmtodossonabstractosyportantonosepuedenimplementarenlaclaseInterface.Puesbien,ahoraenJava8sehaincluidoelmtododefaultquesepuedeimplementarenlaclaseinterfaceyquesuimplementacinsercomnparatodaslasclasesqueimplementenesainterface.Dichoas,unopuedepensarqueconestemtodo se rompe con la premisa de que las clases interface son abstractas puras, pero lainclusindeestenuevomtodoenlasinterfacesdejava8tienendospropsitosinteresantescomoson:
1. Nomodificarlasclasesqueusenesainterface.2. SimularunaSeudoHerenciaMltiple,yaquejavanodisponedeherenciamltiplecomo
tal.Sobreestepuntohablaremosmsadelanteparaaclarareseconceptodeseudoherenciamltiple.
Elpunto1(aunquepuedesonarchapucero)tienebastantesentidoymshoyendaenquees muy importante la rpida respuesta al cambio, ya que suponer un caso en el que hayamosdesarrollado una interface que la implementan 20 clases y necesitemos a ltima hora aadir unanuevafuncionalidadquedebendetenertodaslasclasesqueimplementannuestrainterface.Pueseneste caso con implementar un mtodo default en la interface nos valdra para solucionar elproblemayadaptarnosrpidamentealcambio.Estaseriaunasolucinrpidaaunquesifusemosmuypuristas,conmstiempodeberamosreescribiresosmtodosenlasclasesqueimplementanlainterface.
Para ver esto vamos a dar una solucin rpida al ejemplo puesto en la entrada dePolimorfismoenJavaInterface(ParteII),conejemplos,enlaquesimulbamoselcomportamientodelaseleccinespaoladeftbol.Enesteejemploimplementamoselcomportamientoexpuestoenelsiguientediagramadeclases:
https://github.com/jarroba/InterfaceJava8http://jarroba.com/polimorfismo-en-java-interface-parte-ii-con-ejemplos/http://jarroba.com/polimorfismo-en-java-interface-parte-ii-con-ejemplos/
-
22/3/2015 InterfaceenJava8MetodoDefaultconejemplosJarroba
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 2/8
Como vemos tenemos tres clases que implementan una misma interface, pero ahoraqueremosaadir2nuevoscomportamientosquesoncomunesparalas3clasesqueimplementanlainterface como son dar una rueda de prensa (ruedaPrensa()) y hacer un video publicitario(videoPublicitario()). Pues bien para ello nos creamos estos dos mtodos en la interface y losimplementamosahiquedandoeldiagramadeclasesdelasiguientemanera:
http://jarroba.com/wp-content/uploads/2014/04/Interface_java_jarroba.jpg
-
22/3/2015 InterfaceenJava8MetodoDefaultconejemplosJarroba
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 3/8
Aniveldecdigolainterfacequedaraimplementadadelasiguientemanera:
publicinterfaceIntegranteSeleccionFutbol{
voidconcentrarse();
voidviajar();
voidentrenar();
voidjugarPartido(); defaultvoidruedaPrensa(){ System.out.println("daunaruedadeprensa(desdelaInterface)"); } defaultvoidvideoPublicitario(){ System.out.println("hacerunvideopublicitario(desdelaInterface)"); }
http://jarroba.com/wp-content/uploads/2014/09/interface_default_static_jarroba.png
-
22/3/2015 InterfaceenJava8MetodoDefaultconejemplosJarroba
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 4/8
}
En el mtodo MAIN nos creamos creamos un objeto de cada clase y ejecutamos losmtodosimplementadosenlainterfacedelasiguientemanera:
//ArrayListdeobjetosSeleccionFutbol.IdenpendientementedelaclasehijaalaquepertenezcaelobjetopublicstaticArrayListintegrantes=newArrayList();
publicstaticvoidmain(String[]args){
SeleccionFutboldelBosque=newEntrenador(1,"Vicente","DelBosque",60,28489); SeleccionFutboliniesta=newFutbolista(2,"Andres","Iniesta",29,6,"InteriorDerecho"); SeleccionFutbolraulMartinez=newMasajista(3,"Ral","Martinez",41,"LicenciadoenFisioterapia",18);
integrantes.add(delBosque); integrantes.add(iniesta); integrantes.add(raulMartinez);
//RUEDADEPRENSACONELMTODODEFAULT System.out.println("Todoslosintegrantesdanunaruedadeprensa.(Todosejecutanelmismomtodo)"); for(SeleccionFutbolintegrante:integrantes){ System.out.print(integrante.getNombre()+""+integrante.getApellidos()+">"); integrante.ruedaPrensa(); } //VIDEOPUBLICITARIOCONELMTODODEFAULT System.out.println("Todoslosintegrantesgrabanunvideopublicitario.(Todosejecutanelmismomtodo)"); for(SeleccionFutbolintegrante:integrantes){ System.out.print(integrante.getNombre()+""+integrante.getApellidos()+">"); integrante.videoPublicitario(); }
...................................
}
Como salida a la ejecucin de este fragmento de cdigo tenemos el comportamientoimplementadoenlaclaseinterface:
Todoslosintegrantesdanunaruedadeprensa.(Todosejecutanelmismomtodo)VicenteDelBosque>daunaruedadeprensa(desdelaInterface)AndresIniesta>daunaruedadeprensa(desdelaInterface)RalMartinez>daunaruedadeprensa(desdelaInterface)
-
22/3/2015 InterfaceenJava8MetodoDefaultconejemplosJarroba
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 5/8
Todoslosintegrantesgrabanunvideopublicitario.(Todosejecutanelmismomtodo)VicenteDelBosque>hacerunvideopublicitario(desdelaInterface)AndresIniesta>hacerunvideopublicitario(desdelaInterface)RalMartinez>hacerunvideopublicitario(desdelaInterface)
Como vemos hemos podido implementar un nuevo comportamiento desde una interface yqueestesepuedausarencadaunadelasclasesqueimplementanesainterface.
Porotro ladohemosdichoquecon lasnuevas interfacesde java8podemossimularunaSeudo Herencia Mltiple. Dicho esto hay que matizar un poco estas palabras de la seudoherencia multiple. Sabemos que la herencia permite compartir automticamente los atributos ymtodosdelaclasepadrealasclaseshijas.PorotroladosabemosqueJavanosoportaherenciamltipleyaquesolopermiteheredarmtodosyatributosdeunasolaclaseesdecir,quesolotieneuna clasepadre.Con las nuevas interfacesde java8 podemoshacer queuna clase implementetodaslasinterfacesquequierayalhabermtodosdefaultenlasinterfaces,todaslasclasesqueimplementen esa interface tendrn esos mtodos, los cuales no tendrm que ser sobreescritos.Dichoenotrapalabrasconlasinterfacesdejava8podemostenerherenciamltipleaplicadaexclusivamenteamtodos,peronoaatributos.
EnelproyectoenJava8quehemoscompartidoalprincipio,hemosimplementadounejemploparaverestodelaseudoherenciamltple.Fijemonosenelsiguientediagramadeclases,enelquevemosquetenemosdosinterfacesllamadasDeportistaInterfaceeIntegranteInterfaceyenellastenemosdosmtodosdefault.VemosqueFutbolistaHMyEntrenadorHMimplementanlasdosinterfaces,porlotantotendrnlosmtodosdefaultdelasdosinterfacesesdecir,queescomosiheredasen los mtodos de la interface. Por otro lado la clase MasajistaHM solo implementa lainterface IntegranteInterfaceyconestasolo hereda losmtodos defaultdeesta interface.Enresumenhemossimuladounaherenciademtodosperonodeatributosquehemosheredadodelaclaseinterface.
http://jarroba.com/herencia-en-la-programacion-orientada-a-objetos-ejemplo-en-java/
-
22/3/2015 InterfaceenJava8MetodoDefaultconejemplosJarroba
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 6/8
Acontinuacinvamosavercomohemosimplementadolasinterfaces:
publicinterfaceIntegranteInterface{
defaultvoidconcentrarse(){ System.out.println("Concentrarse(InterfaceIntegranteInterface)");}
defaultvoidviajar(){ System.out.println("Viajar(InterfaceIntegranteInterface)");}
}
publicinterfaceDeportistaInterface{
defaultvoidentrenar(){ System.out.println("Entrenar(InterfaceDeportistaInterface)");}
defaultvoidjugarPartido(){ System.out.println("JugarPartido(InterfaceDeportistaInterface)");}}
Vemos como hemos implementado en losmtodos default un comportamiento que van aheredarlasclasesqueimplementenesainterface.Acontinuacinmostramosaimplementacinde
http://jarroba.com/wp-content/uploads/2014/09/interface_java8_seudo_herencia_multiple_jarroba.jpeg
-
22/3/2015 InterfaceenJava8MetodoDefaultconejemplosJarroba
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 7/8
lasclasesFutbolistaHM,EntrenadorHMyMasajistaHM:
publicclassFutbolistaHMextendsSeleccionFutbolHMimplementsDeportistaInterface,IntegranteInterface{
privateintdorsal; privateStringdemarcacion;
//constructor,getterysetter}
publicclassEntrenadorHMextendsSeleccionFutbolHMimplementsDeportistaInterface,IntegranteInterface{
privateintidFederacion;
//constructor,getterysetter}
publicclassMasajistaHMextendsSeleccionFutbolHMimplementsIntegranteInterface{
privateStringtitulacion; privateintaniosExperiencia;
//constructor,getterysetter
}
Comocomocadaunadelasclasesimplementalainterfacequeleinteresa.Veamosahoracomocadaunadeestasclasesejecuta losmtodosde la interfaceconelsiguiente fragmentodecdigoescritoenelmtodoMAIN:
//ArrayListdeobjetosSeleccionFutbol.Idenpendientementedelaclasehija//alaquepertenezcaelobjetopublicstaticArrayListintegrantes=newArrayList();
publicstaticvoidmain(String[]args){
SeleccionFutbolHMdelBosque=newEntrenadorHM(1,"Vicente","DelBosque",60,28489); SeleccionFutbolHMiniesta=newFutbolistaHM(2,"Andres","Iniesta",29,6,"InteriorDerecho"); SeleccionFutbolHMraulMartinez=newMasajistaHM(3,"Ral","Martinez",41,"LicenciadoenFisioterapia",18);
integrantes.add(delBosque); integrantes.add(iniesta); integrantes.add(raulMartinez); //VIAJE System.out.println("Todoslosintegrantesviajanparajugarunpartido.(Todosejecutanelmismomtodo)"); for(SeleccionFutbolHMintegrante:integrantes){
-
22/3/2015 InterfaceenJava8MetodoDefaultconejemplosJarroba
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 8/8
System.out.print(integrante.getNombre()+""+integrante.getApellidos()+">"); ((IntegranteInterface)integrante).viajar(); } //ENTRENAR System.out.println("nSoloDelBosqueeIniestaentrenanyaqueelmasajistanotienenelmtodoentrenar"); System.out.print(delBosque.getNombre()+""+delBosque.getApellidos()+">"); ((DeportistaInterface)delBosque).entrenar(); System.out.print(iniesta.getNombre()+""+iniesta.getApellidos()+">"); ((DeportistaInterface)iniesta).entrenar(); }
Vemosenestefragmentodecdigoquetodossoncapacesdeejecutarelmtodoviajar()delainterfaceIntegrantesInterface,yaquetodosimplementanestainterfaceysololosobjetosdelaclase FutbolistaHM y EntrenadorHM pueden ejecutar el mtodo entrenar() de la interfaceDeportistaInterface.Comoresultadoaestecdigotenemoslosiguiente:
Todoslosintegrantesviajanparajugarunpartido.(Todosejecutanelmismomtodo)VicenteDelBosque>Viajar(InterfaceIntegranteInterface)AndresIniesta>Viajar(InterfaceIntegranteInterface)RalMartinez>Viajar(InterfaceIntegranteInterface)
SoloDelBosqueeIniestaentrenanyaqueelmasajistanotienenelmtodoentrenarVicenteDelBosque>Entrenar(InterfaceDeportistaInterface)AndresIniesta>Entrenar(InterfaceDeportistaInterface)
Estoesunpocoenresumenloquenospermitenhacerlasnuevasinterfacesdejava8,quenospermitenserunpocomsagilesalahoradehacercambiosdeltimahoraymediosimularunaherenciamultiple.