Interfaces en Java
Interfaces en Java
Interfaces en Java
Un interfaz es una lista de acciones que puede llevar a cabo un determinado objeto.
Sorpresa, eso no eran los mtodos que se definen en una clase? Casi, en una clase
adems de aparecer los mtodos apareca el cdigo para dichos mtodos, en cambio en
un interfaz slo existe el prototipo de una funcin, no su cdigo.
Veamoslo con un ejemplo: Pensemos en un interfaz que en su lista de mtodos
aparezcan los mtodos despegar, aterrizar, servirComida y volar. Todos pensamos en un
avin, verdad? El motivo es sencillamente que avin es el concepto que engloba las
acciones que hemos detallado antes, a pesar que existan muchos objetos avin
diferentes entre s, por ejemplo Boeing 747, Boeing 737, MacDonell-Douglas.
Lo realmente interesante es que todos ellos, a pesar de pertenecer a clases distintas,
poseen el interfaz avin, es decir poseen los mtodos detallados en la lista del interfaz
avin.
Esto significa tambin que a cualquier avin le podemos pedir que vuele, sin
importarnos a que clase real pertenezca el avin, evidentemente cada clase especificar
como volar el avin (porque proporciona el cdigo de la funcin volar).
En java un interfaz define la lista de mtodos, pero para que una clase posea un interfaz
hay que indicar explcitamente que lo implementa mediante la clasula implements.
Pero veamos primero la estructura de un interfaz:
[modif.visibilidad] interface nombreInterfaz [extends listaInterfaces]
{
prototipo mtodo1;
..
prototipo mtodo1;
}
Donde modif.visibilidad puede ser public o bien sin especificar, es decir visibilidad
pblica (desde cualquier clase se puede emplear el interfaz) o de paquete (slo se puede
emplear desde clases del mismo paquete).
nombreInterfaz por convenio sigue las mismas reglas de nomenclatura que las clases, y
en muchos casos acaba en able (que podamos traducir como: ser capaz de).
La clasula opcional extends se emplea para conseguir que un interfaz hereda las
funciones de otro/s interfaces, simplemente listaInterfaces es una lista separaada por
coma de interfaces de los que se desea heredar.
Prcticas:
Vamos a definir el interfaz Cantante, un interfaz muy simple que slo posee un mtodo: cantar.
Podemos ver que construimos un objeto (p) de tipo persona y se lo pasamos a la funcin
hacerCantar. Esta funcin espera recibir un objeto Cantante, y una persona lo es, por
tanto la recibe y llama al mtodo cantar del objeto recibido.
Probemos a intentar pasar a la funcin hacerCantar en lugar del objeto Persona (p) un
objeto String (texto), resultado: error de compilacin.
Contruyamos ahora la clase Canario (Canario.java), pensando que tambin sabe cantar:
public class Canario implements Cantante
{
private int peso;
/* Aqui vendran el resto de atributos y funciones propias de un canario */
Tras ejecutar comprobaremos que podemos pasar tanto una Persona como un Canario a
la funcin hacerCantar, de tal manera que dentro de dicha funcin slo accedamos a las
funciones del interfaz y no habr problemas. Por ejemplo, si pusieramos:
c.SetNombre("Luis")
Si una interfaz define un tipo (al igual que una clase define un tipo) pero ese
tipo no provee de ningn mtodo podemos preguntarnos: qu se gana con
las interfaces en Java? La implementacin (herencia) de una interfaz no
podemos decir que evite la duplicidad de cdigo o que favorezca la
reutilizacin de cdigo puesto que realmente no proveen cdigo.
En cambio s podemos decir que rene las otras dos ventajas de la herencia: favorecer el
mantenimiento y la extensin de las aplicaciones. Por qu? Porque al definir
interfaces permitimos la existencia de variables polimrficas y la invocacin
polimrfica de mtodos. En el diagrama que vimos anteriormente tanto rboles como
arbustos, vehculos y personas son de tipo Actor, de modo que podemos generar cdigo
que haga un tratamiento en comn de todo lo que son actores. Por ejemplo, podemos
necesitar una lista de Actores. Podemos declarar una variable como de tipo Actor
(aunque no puedan existir instancias de Actor) que permita referenciar alternativamente
a objetos de las distintas subclases de la interfaz.
Un aspecto fundamental de las interfaces en Java es hacer lo que ya hemos dicho que
hace una interfaz de forma genrica: separar la especificacin de una clase (qu hace)
de la implementacin (cmo lo hace). Esto se ha comprobado que da lugar a
programas ms robustos y con menos errores. Pensemos en el API de Java. Por ejemplo,
El hecho de declarar una variable de tipo lista, por ejemplo List <String> miLista; nos
dice que miLista va a ser una implementacin de List, pero todava no hemos definido
cul de las posibles implementaciones va a ser. De hecho, el cdigo podra definir que
se implementara de una u otra manera en funcin de las circunstancias usando
condicionales. O a nivel de programacin, mantendramos la definicin como List y nos
permitira comprobar el rendimiento de distintas configuraciones (hacer funcionar
miLista bien como ArrayList bien como LinkedList viendo su rendimiento). La variable
declarada se crea cuando escribimos miLista = new LinkedList <String> (); o tambin
se puede usar la sintaxis: List <String> miLista = new LinkedList <String> ();
Usar una u otra implementacin puede dar lugar a diferentes rendimientos de un
programa. ArrayList responde muy bien para la bsqueda de elementos situados en
posiciones intermedias pero la insercin o eliminacin de elementos puede ser ms
rpida con una LinkedList. Declarando las variables simplemente como List tendremos
la posibilidad de que nuestro programa pase de usar un tipo de lista a otro tipo.
Como List es un tipo, podemos especificar los mtodos para que requieran List y
despus enviarles como parmetro bien un ArrayList bien un LinkedList sin tener que
preocuparnos de hacer cambios en el cdigo en caso de que usramos uno u otro tipo de
lista. En esencia, usando siempre List, el nico sitio donde habra que especificar la
clase concreta sera donde se declara la creacin de la variable, con lo cual todo nuestro
cdigo (excepto el lugar puntual donde se crea la variable) es independiente del tipo de
lista que usemos y esto resulta ventajoso porque pasar de usar un tipo de lista a usar otro
resultar muy sencillo.
Los mtodos de ArrayList en algunos casos definen los mtodos abstractos de List, y en
otros casos son especficos. Recordar que en List todos los mtodos son abstractos por
(circ1);
serieDeFiguras.add
(circ2);
serieDeFiguras.add
(rect1);
float areaTotal = 0;
for (Figura tmp: serieDeFiguras) {
System.out.println ("Tenemos un total de " + serieDeFiguras.size() + " figuras y su rea total es de " +
areaTotal + " uds cuadradas") } } //Cierre del main y de la clase