Академический Документы
Профессиональный Документы
Культура Документы
InterfaceenJava8MetodoDefaultconejemplosJarroba
nterfaceenJava8MetodoDefaultcon
ejemplos
ElproyectodeestepostlopuedesdescargarpulsandoAQUI.
Enestaentradavamosahahablardeuncambiobastanteinteresantequehanintegradoen
Java8,comoeselmtododefaultdelasnuevasinterfaces.
Como ya se comento en las entradas en las que hablamos depolimorfismo, una clase
interface es una clase abstracta pura en la que todos sus mtodos son abstractos y por
tantonosepuedenimplementarenlaclaseInterface.Puesbien,ahoraenJava8sehaincluido
elmtododefaultquesepuedeimplementarenlaclaseinterfaceyquesuimplementacinser
comnparatodaslasclasesqueimplementenesainterface.Dichoas,unopuedepensarquecon
este mtodo se rompe con la premisa de que las clases interface son abstractas puras, pero la
inclusindeestenuevomtodoenlasinterfacesdejava8tienendospropsitosinteresantescomo
son:
1. Nomodificarlasclasesqueusenesainterface.
2. SimularunaSeudoHerenciaMltiple,yaquejavanodisponedeherenciamltiplecomo
tal.Sobreestepuntohablaremosmsadelanteparaaclarareseconceptodeseudoherencia
mltiple.
Elpunto1(aunquepuedesonarchapucero)tienebastantesentidoymshoyendaenque
es muy importante la rpida respuesta al cambio, ya que suponer un caso en el que hayamos
desarrollado una interface que la implementan 20 clases y necesitemos a ltima hora aadir una
nuevafuncionalidadquedebendetenertodaslasclasesqueimplementannuestrainterface.Puesen
este caso con implementar un mtodo default en la interface nos valdra para solucionar el
problemayadaptarnosrpidamentealcambio.Estaseriaunasolucinrpidaaunquesifusemos
muypuristas,conmstiempodeberamosreescribiresosmtodosenlasclasesqueimplementanla
interface.
Para ver esto vamos a dar una solucin rpida al ejemplo puesto en la entrada de
PolimorfismoenJavaInterface(ParteII),conejemplos,enlaquesimulbamoselcomportamiento
delaseleccinespaoladeftbol.Enesteejemploimplementamoselcomportamientoexpuestoen
elsiguientediagramadeclases:
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 1/8
22/3/2015
InterfaceenJava8MetodoDefaultconejemplosJarroba
Como vemos tenemos tres clases que implementan una misma interface, pero ahora
queremosaadir2nuevoscomportamientosquesoncomunesparalas3clasesqueimplementanla
interface 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 los
implementamosahiquedandoeldiagramadeclasesdelasiguientemanera:
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 2/8
22/3/2015
InterfaceenJava8MetodoDefaultconejemplosJarroba
Aniveldecdigolainterfacequedaraimplementadadelasiguientemanera:
publicinterfaceIntegranteSeleccionFutbol{
voidconcentrarse();
voidviajar();
voidentrenar();
voidjugarPartido();
defaultvoidruedaPrensa(){
System.out.println("daunaruedadeprensa
(desdelaInterface)");
defaultvoidvideoPublicitario(){
System.out.println("hacerunvideopublicita
rio(desdelaInterface)");
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 3/8
22/3/2015
InterfaceenJava8MetodoDefaultconejemplosJarroba
En el mtodo MAIN nos creamos creamos un objeto de cada clase y ejecutamos los
mtodosimplementadosenlainterfacedelasiguientemanera:
//ArrayListdeobjetosSeleccionFutbol.Idenpendientemented
elaclasehijaalaquepertenezcaelobjeto
publicstaticArrayListintegrantes=newArrayList();
publicstaticvoidmain(String[]args){
SeleccionFutboldelBosque=newEntrenador(1,"Vicent
e","DelBosque",60,28489);
SeleccionFutboliniesta=newFutbolista(2,"Andres",
"Iniesta",29,6,"InteriorDerecho");
SeleccionFutbolraulMartinez=newMasajista(3,"Ra
l","Martinez",41,"LicenciadoenFisioterapia",18);
integrantes.add(delBosque);
integrantes.add(iniesta);
integrantes.add(raulMartinez);
//RUEDADEPRENSACONELMTODODEFAULT
System.out.println("Todoslosintegrantesdanunarue
dadeprensa.(Todosejecutanelmismomtodo)");
for(SeleccionFutbolintegrante:integrantes){
System.out.print(integrante.getNombre()+""
+integrante.getApellidos()+">");
integrante.ruedaPrensa();
//VIDEOPUBLICITARIOCONELMTODODEFAULT
System.out.println("Todoslosintegrantesgrabanunv
ideopublicitario.(Todosejecutanelmismomtodo)");
for(SeleccionFutbolintegrante:integrantes){
System.out.print(integrante.getNombre()+""
+integrante.getApellidos()+">");
integrante.videoPublicitario();
}
...................................
}
Todoslosintegrantesdanunaruedadeprensa.(Todosejecutanelmismomtodo)
VicenteDelBosque>daunaruedadeprensa(desdelaInterface)
AndresIniesta>daunaruedadeprensa(desdelaInterface)
RalMartinez>daunaruedadeprensa(desdelaInterface)
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 4/8
22/3/2015
InterfaceenJava8MetodoDefaultconejemplosJarroba
Todoslosintegrantesgrabanunvideopublicitario.(Todosejecutanelmismomtodo)
VicenteDelBosque>hacerunvideopublicitario(desdelaInterface)
AndresIniesta>hacerunvideopublicitario(desdelaInterface)
RalMartinez>hacerunvideopublicitario(desdelaInterface)
Como vemos hemos podido implementar un nuevo comportamiento desde una interface y
queestesepuedausarencadaunadelasclasesqueimplementanesainterface.
Por otro lado hemos dicho que con las nuevas interfaces de java 8 podemos simular una
Seudo Herencia Mltiple. Dicho esto hay que matizar un poco estas palabras de la seudo
herencia multiple. Sabemos que la herencia permite compartir automticamente los atributos y
mtodosdelaclasepadrealasclaseshijas.PorotroladosabemosqueJavanosoportaherencia
mltipleyaquesolopermiteheredarmtodosyatributosdeunasolaclaseesdecir,quesolotiene
una clase padre. Con las nuevas interfaces de java 8 podemos hacer que una clase implemente
todaslasinterfacesquequierayalhabermtodosdefaultenlasinterfaces,todaslasclasesque
implementen esa interface tendrn esos mtodos, los cuales no tendrm que ser sobreescritos.
Dichoenotrapalabrasconlasinterfacesdejava8podemostenerherenciamltipleaplicada
exclusivamenteamtodos,peronoaatributos.
EnelproyectoenJava8quehemoscompartidoalprincipio,hemosimplementadounejemplo
paraverestodelaseudoherenciamltple.Fijemonosenelsiguientediagramadeclases,enelque
vemosquetenemosdosinterfacesllamadasDeportistaInterfaceeIntegranteInterfaceyenellas
tenemosdosmtodosdefault.VemosqueFutbolistaHMyEntrenadorHMimplementanlasdos
interfaces,porlotantotendrnlosmtodosdefaultdelasdosinterfacesesdecir,queescomosi
heredasen los mtodos de la interface. Por otro lado la clase MasajistaHM solo implementa la
interface IntegranteInterface y con esta solo hereda los mtodos default de esta interface. En
resumenhemossimuladounaherenciademtodosperonodeatributosquehemosheredadodela
claseinterface.
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 5/8
22/3/2015
InterfaceenJava8MetodoDefaultconejemplosJarroba
Acontinuacinvamosavercomohemosimplementadolasinterfaces:
publicinterfaceIntegranteI
nterface{
publicinterfaceDeportistaI
nterface{
defaultvoidconcentrars
e(){
System.out.printl
n("Concentrarse(InterfaceI
ntegranteInterface)");
}
defaultvoidentrenar()
{
System.out.printl
n("Entrenar(InterfaceDepor
tistaInterface)");
}
defaultvoidviajar(){
System.out.printl
n("Viajar(InterfaceIntegra
nteInterface)");
}
defaultvoidjugarPartid
o(){
System.out.printl
n("JugarPartido(Interface
DeportistaInterface)");
}
}
Vemos como hemos implementado en los mtodos default un comportamiento que van a
heredarlasclasesqueimplementenesainterface.Acontinuacinmostramosaimplementacinde
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 6/8
22/3/2015
InterfaceenJava8MetodoDefaultconejemplosJarroba
lasclasesFutbolistaHM,EntrenadorHMyMasajistaHM:
publicclassFutb
olistaHMextends
SeleccionFutbolHM
implementsDeport
istaInterface,
IntegranteInterfa
ce{
publicclassEntr
enadorHMextends
SeleccionFutbolHM
implementsDeport
istaInterface,
IntegranteInterfa
ce{
privatei
ntdorsal;
privateS
tringdemarcacio
n;
privatei
ntidFederacion;
//constr
uctor,getterys
etter
}
//constr
uctor,getterys
etter
}
publicclassMasaj
istaHMextendsSel
eccionFutbolHM
implementsIntegra
nteInterface{
privateSt
ringtitulacion;
privatein
taniosExperienci
a;
//constru
ctor,getteryset
ter
}
Comocomocadaunadelasclasesimplementalainterfacequeleinteresa.Veamosahora
como cada una de estas clases ejecuta los mtodos de la interface con el siguiente fragmento de
cdigoescritoenelmtodoMAIN:
//ArrayListdeobjetosSeleccionFutbol.Idenpendientemented
elaclasehija
//alaquepertenezcaelobjeto
publicstaticArrayListintegrantes=newArrayList();
publicstaticvoidmain(String[]args){
SeleccionFutbolHMdelBosque=newEntrenadorHM(1,"Vi
cente","DelBosque",60,28489);
SeleccionFutbolHMiniesta=newFutbolistaHM(2,"Andr
es","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("Todoslosintegrantesviajanpara
jugarunpartido.(Todosejecutanelmismomtodo)");
for(SeleccionFutbolHMintegrante:integrantes){
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 7/8
22/3/2015
InterfaceenJava8MetodoDefaultconejemplosJarroba
System.out.print(integrante.getNombre()+""
+integrante.getApellidos()+">");
((IntegranteInterface)integrante).viajar();
//ENTRENAR
System.out.println("nSoloDelBosqueeIniestaentren
anyaqueelmasajistanotienenelmtodoentrenar");
System.out.print(delBosque.getNombre()+""+delBos
que.getApellidos()+">");
((DeportistaInterface)delBosque).entrenar();
System.out.print(iniesta.getNombre()+""+iniest
a.getApellidos()+">");
((DeportistaInterface)iniesta).entrenar();
Vemosenestefragmentodecdigoquetodossoncapacesdeejecutarelmtodoviajar()
delainterfaceIntegrantesInterface,yaquetodosimplementanestainterfaceysololosobjetosdela
clase FutbolistaHM y EntrenadorHM pueden ejecutar el mtodo entrenar() de la interface
DeportistaInterface.Comoresultadoaestecdigotenemoslosiguiente:
Todoslosintegrantesviajanparajugarunpartido.(Todosejecutanelmismomtodo)
VicenteDelBosque>Viajar(InterfaceIntegranteInterface)
AndresIniesta>Viajar(InterfaceIntegranteInterface)
RalMartinez>Viajar(InterfaceIntegranteInterface)
SoloDelBosqueeIniestaentrenanyaqueelmasajistanotienenelmtodoentrenar
VicenteDelBosque>Entrenar(InterfaceDeportistaInterface)
AndresIniesta>Entrenar(InterfaceDeportistaInterface)
Estoesunpocoenresumenloquenospermitenhacerlasnuevasinterfacesdejava8,que
nospermitenserunpocomsagilesalahoradehacercambiosdeltimahoraymediosimularuna
herenciamultiple.
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 8/8