domingo, 28 de junio de 2015

Interfaces en Java

Las interfaces en Java
Supongamos que tenemos un conjunto de clases y necesitamos que hereden de JFrame, pero además necesitamos que herede de otra clase de la cual solo necesitamos sus métodos, es decir de una clase abstracta. Java no permite realizar esta acción debido a que no soporta herencia múltiple. Existe un artificio para la herencia múltiple que se denomina: implementar interfaces.

No necesariamente se aplica una interface como artificio para la herencia múltiple, cuando solo se tiene métodos comunes, constantes comunes entonces se habla de una interface.

Una interface es como un protocolo: todas las clases deben implementar todos los métodos abstractos de la interface.

Generalmente, nombres como: comparable, medible, ordenable, etc se asocian directamente a una interface.

Para hacer uso de una interface luego del nombre de la clase se escribe la palabra implements seguido del nombre de la interface. En herencia se maneja extends en interfaces implements.

Cabe mencionar que existen interfaces predeterminadas por java como por ejemplo: clonable, comparable, seriable, etc.

Ejemplo:

Se tiene 2 clases: Estudiante y Curso. La idea es gestionar a los Estudiantes mediante Curso. Luego ordenar los objetos Estudiante contenidos en un ArrayList creado en Curso. Al final implementar una interface (Comparable) predeterminado por Java, para ordenar los elementos del ArrayList de acuerdo a algún parámetro deseado.

La clase estudiante implementa la interface Comparable. Al momento de implementar esta clase, es obligación implementar el único método abstracto de esta clase: toCompare.
Entonces, se implementa el método toCompare y se lo sobreescribe:
Para la sobrescritura, dependiendo del tipo de parámetro se retorna un entero que devuelve un entero -1 en caso de que el Objeto comparado sea "menor" que alguno de los demás objetos.

La sobrescritura de este método nos sirve para la utilización dentro de la misma clase. Pero si nos fijamos todos los Estudiantes están en un ArrayList dentro de la clase curso.

Debe ser desde esta clase que se de el ordenamiento debido a que contiene la información de todos los estudiantes ingresados. Entonces como ordenar desde la clase Curso?

La clase Collections que hereda directamente de Object (es decir no necesitamos importarla para usarla) tiene un método llamado sort, que hereda de directamente de la interface comparable, tal como lo muestra el API de java:

Entonces, creamos un método llamado ordenarPorEdad en la clase Curso que contiene lo siguiente:

Esto hará que los Estudiantes dentro de listaEstudiantes se ordenen por edad, en orden ascendente de acuerdo al ordenamiento natural.

Por último se muestra la clase principal en la cual se crea los archivos y se hace el ordenamiento respectivo. Se comprueba por pantalla.


La salida por consola:

LA INTERFAZ CLONEABLE
Esta interfaz permite realizar una copia exacta de un objeto, es decir cada campo tendrá el mismo contenido para el objeto original y el objeto clonado. Cabe recalcar que algunas referencias indican que no es muy recomendado utilizar esta interfaz ya que pueden existir subclases que necesiten implementar su propia lógica clonable, y al momento de heredar de una clase que implemente Clonable y tenga sobrescrito el método clone de cierta forma, puede ser que para la clase hija no sea tan conveniente. Más información de porqué muchos programadores utilizan el constructor de copia en vez de la interface clonable aquí: http://stackoverflow.com/questions/4081858/about-java-cloneable

Como sea, voy a mostrar un ejemplo de como implementar está clase. Qué a diferencia de la interfaz Comparable es más simple.


En la clase Estudiante se debe asegurarse 2 cosas:
1) Que se implemente la interfaz Comparable
2) Sobrescribir el método clone

La excepción CloneNotSupportedException solo se da cuando la clase no implementa la interfaz Clonable.

Algo ha tomar en cuenta es que si se aplica herencia, este método nos devuelve un objeto de tipo estudiante, es decir es necesario hacer un casting al tipo de la clase hija.

En el main, tendríamos algo así:

Y la salida por pantalla:


Por si fuera necesario, también dejo un ejemplo de un constructor de copia, que es más recomendado.

No hay comentarios:

Publicar un comentario