Está en la página 1de 11

Tcnicas avanzadas de programacin

Interfaces


Ramiro Lago


2
Repaso: clases abstractas
Hemos visto los mtodos y clases abstractas
Un mtodo abstracto indica que slo es un prototipo, es decir, no tiene
cuerpo:
abstract class Figura {
.
abstract double calcularArea();
}
No podemos hacer instancias de una clase que tenga un mtodo
abstract. Lo que si podemos hacer es crear una subclase, que debe
implementar el mtodo.
Una clase que contiene algn mtodo abstract debe estar declarada
explcitamente como abstract.
Pueden existir clases abstract que no tengan mtodos abstract. Pero
sigue siendo vlida la regla: una clase abstracta se puede usar a travs
de la creacin de una subclase.
Su principal utilidad es la de servir como un marco que sirve de gua
para definir una implementacin en las subclases.
3
Introduccin a los interfaces
Java amplia el concepto de clases abstractas con los interfaces: un
conjunto de prototipos de mtodos, sin implementacin; es la
especificacin de un interfaz lgico de clase, pero delegando la
implementacin para las subclases. Por ejemplo:
interface Viviente {
void alimentarse( float incremento );
float getNivelAlimento();
Object reproducirse();
}
Un interface declara un marco abstracto de comportamiento.
Al igual que ocurre con las clases abstractas, no admite instancias.
Es aceptable definir los mtodos como abstract, aunque no es
necesario.
Los mtodos de un interfaz siempre son pblicos, aunque no se
declaren explcitamente as.
4
Implementando un interface
Una clase puede implementar tantos interfaces como quiera. El
manejo de interfaces sustituye a la necesidad de usar herencia
mltiple.
Una clase que implementa un interfaz debe usar la palabra
implements y especificar el comportamiento de los mtodos:
class Animal implements Viviente {
private float alimento = 0;

public void alimentarse( float incremento ) {
alimento = alimento + incremento;
}
public Object reproducirse() { return new animal(); }
public float getNivelAlimento() { return alimento; }
}

5
Usando (y comprendiendo) un interfaz
De un interface (al igual que de las clases abstractas) no puede
haber instancias. Pero si podemos tener referencias del tipo
interface. Por ejemplo:
Viviente v = new Animal();
v.alimentarse( 18 );
System.out.println( v.getNivelAlimento() );
Un protocolo es un conjunto de reglas que indican como debemos
actuar (movernos, hablar, etc.). En nuestro caso nos quedamos con
el concepto de protocolo como pauta para hablar unos objetos
con otros
Un matiz sobre el que profundizaremos ms adelante: el
programador que anteriormente ha usado la clase Animal tiene un
protocolo para pasar mensajes a los objetos de dicha clase;
dicho de otra forma se ve obligado a seguir una pauta
Dicha pauta (protocolo) es el interfaz lgico (Viviente) de la
clase Animal

6
Interfaces lgicos para el trabajo en equipo
El uso de interfaces es importante para el trabajo en equipo, ya que es la forma de
definir un protocolo de paso de mensajes entre los diferentes subsistemas
Supongamos que tenemos equipos de ingeniera desarrollando el subsistema de Seres
Vivos: Animal, Vegetal, etc y que a su vez tenemos un equipo que desarrolla el
subsistema Granja, el cual usa el subsistema de Seres Vivos:

Granja

SeresVivos
Animal
Vegetal
Carnvoro
Viviente
alimentarse
reproducirse
getNivelAlimento
El interfaz lgico es el protocolo que:
Coordina a los programadores del subsistema SeresVivos entre s; ya que les obliga a
compartir una forma de paso de mensajes, es decir, tienen que implementar los mtodos
del interfaz Viviente
Coordina a los programadores del subsistema Granja con los del subsistema SeresVivos, ya
que indica a los primeros la forma en que tienen que usar las clases de los segundos, es decir,
la forma en que tienen que mandar mensajes
7
Java Collections Framework
El JCF es un buen ejemplo de manejo de interfaces.
Vamos a ver algunos ejemplos de interfaces, situados en
el paquete java.util:
Enumeration
Collection
List
A la hora de consultar la documentacin del API de Java,
se especifican los interfaces y sus implementaciones. Por
ejemplo, si consultamos List podremos ver:
java.util
Interface List
All Superinterfaces:
Collection
All Known Implementing Classes:
AbstractList, ArrayList, LinkedList, Vector
Esto indica que List es un interface que hereda del
interface Collection. Podemos encontrar dos clases que
implementan su comportamiento: ArrayList y Vector.
Collections (interfaz)
List (interfaz)
Vector ArrayList
8
Enumeration
Enumeration tiene dos mtodos:
boolean hasMoreElements()
Object nextElement()
Las clases que lo implementan facilitan el recorrido de estructuras de
datos. Recuperan de forma continua todos los elementos de
un conjunto de valores, uno por uno. Una vez que se enumeran
todos los elementos no se puede volver atrs.
Ejemplo para imprimir todos los elementos de un Vector v:
for ( Enumeration e = v.elements() ; e.hasMoreElements() ;) {
System.out.println(e.nextElement());
}
Ejemplo para obtener todas las entradas de un archivo jar:
for ( Enumeration e = jar.entries() ; e.hasMoreElements() ;) {
entry = (JarEntry) e.nextElement();
....
}


9
Implementando Enumeration: StringTokenizer
Un ejemplo de clase que implementa el comportamiento de Enumeration es
StringTokenizer. Ya sabemos lo que hace un Tokenizer:
Recibe un conjunto de elementos, en este caso una cadena de caracteres
Devuelve sus elementos. En este caso las expresiones separadas por uno o unos
espacios en blanco.
Ejemplo:
StringTokenizer st = new StringTokenizer("this is a test");
System.out.println( st.countTokens() );
while (st.hasMoreElements()) {
System.out.println( (String) st.nextElement());
}
System.out.println( st.countTokens() );
En este ejemplo se puede observar que StringTokenizer implementa de
forma especfica countTokens(), que nos devuelve el nmero de tokens
disponibles. Es necesario insistir en la palabra disponible, ya que la
segunda llamada a este mtodo devuelve cero (ya se ha llegado al final y
no hay ningn token disponible).
Existe un constructor al que se puede pasar como segundo argumento un
String que representa al delimitador.
10
Collection y List
Collection:
Describe el comportamiento de una repisa o lineal donde se almacenan
elementos. No asegura:
Que no haya duplicados.
Que estn ordenados.
Interesante: es un array dinmico.
Algunos mtodos de Collection:
int size(): devuelve el nmero de elementos.
boolean isEmpty(): devuelve true si est vacia.
boolean add( Object o ): aade el elemento a la coleccin.
Iterator iterator(): devuelve un iterador sobre los elementos (lo veremos ms
adelante).
boolean remove(Object o): elimina el elemento.
List:
Interface que hereda de Collection.
Gestiona las posiciones, por ello, tiene (entre otros) los mtodos:
void add( int index, Object element )
void remove( int index )
Object get( int index ): devuelve el objeto que est en la posicin especificada.
void set ( int index, Object element): almacena el segundo argumento en la posicin
index, devuelve el elemento que antes estuviera.

11
Iterator
El interface Iterator pertenece a la versin 1.2 del JDK y sustituye
funcionalmente al interface Enumeration. Sirve para recorrer un conjunto
de datos.
Diferencias con Enumeration:
Permite borrar elementos
Cambios en los nombres de los mtodos
Mtodos:
boolean hasNext(): devuelve true si hay ms elementos.
Object next(): devuelve el prximo elemento.
void remove(): elimina el ltimo elemento obtenido con next(). Puede haber una
llamada por cada next().
Ejemplo, en el que el iterador nos permite recorrer los elementos de un
Vector:
Vector vec = new Vector();
vec.add( new String( "hola ) );
vec.add( new String( "adios ) );
Iterator it = vec.iterator();
while ( it.hasNext() )
System.out.println( (String) it.next() );

También podría gustarte