You are on page 1of 8

22/3/2015

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();

}
...................................
}

Como salida a la ejecucin de este fragmento de cdigo tenemos el comportamiento


implementadoenlaclaseinterface:

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

You might also like