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

8
nterface en Java 8 Metodo Default con ejemplos El proyecto de este post lo puedes descargar pulsando AQUI. En esta entrada vamos a ha hablar de un cambio bastante interesante que han integrado en Java 8, como es el método “default” de las nuevas interfaces. 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 métodos son abstractos y por tanto no se pueden implementar en la clase Interface. Pues bien, ahora en Java 8 se ha incluido el método “defaultque se puede implementar en la clase interface y que su implementación será común para todas las clases que implementen esa interface. Dicho así, uno puede pensar que con este método se rompe con la premisa de que las clases interface son abstractas puras, pero la inclusión de este nuevo método en las interfaces de java 8 tienen dos propósitos interesantes como son: 1. No modificar las clases que usen esa interface. 2. Simular una “Seudo Herencia Múltiple, ya que java no dispone de herencia múltiple como tal. Sobre este punto hablaremos más adelante para aclarar ese concepto de seudo herencia múltiple. El punto 1 (aunque puede sonar chapucero) tiene bastante sentido y más hoy en día en que es muy importante la rápida 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 añadir una nueva funcionalidad que deben de tener todas las clases que implementan nuestra interface. Pues en este caso con implementar un método “default” en la interface nos valdría para solucionar el problema y adaptarnos rápidamente al cambio. Esta seria una solución rápida aunque si fuésemos muy puristas, con más tiempo deberíamos reescribir esos métodos en las clases que implementan la interface. Para ver esto vamos a dar una solución rápida al ejemplo puesto en la entrada de Polimorfismo en Java Interface (Parte II), con ejemplos“, en la que simulábamos el comportamiento de la selección española de fútbol. En este ejemplo implementamos el comportamiento expuesto en el siguiente diagrama de clases:

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.