Interface en Java 8 -Metodo Default- Con Ejemplos - Jarroba

Post on 16-Nov-2015

59 views 7 download

description

Interface en Java 8

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.