Java, Spring

Conceptos básicos de Java & Spring Framework – Interfaces

Interfaces en Java

Este concepto es muy importante en Java ya que lo estarás utilizando a diestra y siniestra para desarrollar aplicaciones con Spring. Una interfaz en java no es una clase, más bien es un conjunto de declaraciones de métodos en un archivo. En las interfaces se especifica que debe hacerse pero no como se hace. Serán las clases que implementen estas interfaces las que describan la lógica del comportamiento de los métodos declarados en la interfaz. Las palabras clave que java tiene reservadas para utilizar interfaces son interface e implements.

La sintaxis para declarar una interface es:

Dónde:

modificador_acceso Se refiere al ámbito de la interfaz private o public
interface Es la palabra reservada que java tiene para declarar interfaces
NombreInterfaz Es el nombre de la interfaz

La sintaxis para declarar que una clase implementa una interfaz es:

Dónde:

modificador_acceso Se refiere al ámbito de la clase private o public
NombreClase Es el nombre de la clase que implementara los métodos declarados en NombreInterfaz
implements Es la palabra reservada que java tiene para indicar que se van a implementar los métodos de una interfaz
NombreInterfaz Es el nombre de la interfaz que se va a implementar

Nuevamente, para que quede más claro, a continuación dejo un ejemplo muy sencillo de declaración e implementación de interfaces en Java. Básicamente ejemplifica los siguientes conceptos:

  • La herencia entre interfaces
  • La herencia entre clases
  • Como declarar una interfaz
  • Como implementar una interfaz
  • Como obtener una referencia a una interfaz

El ejemplo se compone de 4 interfaces y 6 clases, para entenderlo mejor observa en la siguiente imagen (diagrama de clases UML) como se relacionan entre sí los archivos:

Diagrama de clases del ejemplo con interfaces de java

En el diagrama anterior se usan algunos elementos UML como Clases, Interfaces, Asociaciones, Agregaciones y Realizaciones, temas que no abordare aquí en profundidad, pero si quiero dejar unas cuantas explicaciones rápidas acerca de las asociaciones UML del diagrama:

  • Linea punteada indica implementación
  • Linea continua indica herencia
  • Linea que inicia con flecha en forma de diamante indica que contiene una o mas de la clase donde termina dicha linea
  1. Todas las interfaces heredan de la interfaz IDispositivo (lineas azules)
  2. Todas las clases heredan de la clase Dispositivo (lineas moradas)
  3. Debido al punto 1; todas las clases (a excepción de Dispositivo.java) implementan a la interfaz IDispositivo de forma indirecta (a través de una subinterface)

Haz zoom sino distingues los colores.
He resaltado con morado la asociación de herencia entre clases
He resaltado con azul la asociación de herencia entre interfaces

Bueno sin mas preámbulos a continuación muestro los archivos fuente:

IDispositivo.java – Declaración de Interfaz

Esta interfaz es la raíz de todas las interfaces no hereda ni extiende a nada, solo declara 3 métodos.

IDispositivoAlmacenamiento.java – Declaración de Interfaz y herencia entre interfaces

Esta interfaz extiende a la interfaz raíz IDispositivo por lo tanto todas las clases que quieran implementar esta interfaz deben implementar los 3 métodos de la raíz mas los 2 métodos declarados aquí, en total 5.

IMicroprocesador.java – Declaración de Interfaz y herencia entre interfaces

Esta interfaz extiende a la interfaz raíz IDispositivo por lo tanto todas las clases que quieran implementar esta interfaz deben implementar los 3 métodos de la raíz mas el método declarado aquí, en total 4.

IComputadora.java – Declaración de Interfaz y herencia entre interfaces

Esta interfaz extiende a la interfaz raíz IDispositivo por lo tanto todas las clases que quieran implementar esta interfaz deben implementar los 3 métodos de la raíz mas los 7 métodos declarados aquí, en total 10.

En las siguientes clases la palabra clave @Override (en español sobreescribir) es una anotación de java e indica que el método escrito a continuación se esta sobre-escribiendo porque se declaro vació (vaya, sin implementar) en alguna interfaz. Para guiarte sobre que métodos se están implementando puedes buscar visualmente esta anotación y las veces que aparezca es la cantidad de métodos implementados.

DiscoDuro.java – Implementación de Interfaz y herencia entre clases

Esta clase extiende a la clase Dispositivo.java e implementa a la interfaz IDispositivoAlmacenamiento por lo tanto debe implementar 5 métodos. Observa que se ha declarado 1 atributo con su getter y setter.

MemoriaRAM.java – Implementación de Interfaz y herencia entre clases

Esta clase extiende a la clase Dispositivo.java e implementa a la interfaz IDispositivoAlmacenamiento por lo tanto debe implementar 5 métodos. Observa que se ha declarado 1 atributo con su getter y setter.

Microprocesador.java – Implementación de Interfaz y herencia entre clases

Esta clase extiende a la clase Dispositivo.java e implementa a la interfaz IMicroprocesador por lo tanto debe implementar 4 métodos. Observa que se ha declarado 1 atributo con su getter y setter.

Dispositivo.java – Implementación de Interfaz

Esta clase solo implementa a la interfaz IDispositivo por lo tanto debe implementar solo 3 métodos. Observa que se han declarado 4 atributos con sus getters y setters.

Computadora.java – Implementación de Interfaz y herencia entre clases

Esta clase extiende a la clase Dispositivo.java e implementa a la interfaz IComputadora por lo tanto debe implementar 10 métodos. Se han declarado 4 atributos y sus getters y setters, se ha anotado con @Override el getter del id (linea 87) porque en la clase Dispositivo.java ya se había declarado un atributo con este mismo nombre. Observa que e anotado con @Override el metodo toString() debido a que como sabes en java todos los objetos que heredan de Object por defecto ya tienen definido ese método y aquí lo sobre-escribo a mi conveniencia para mostrar el contenido de mis atributos.

TestInterfaces.java – Uso de las clases que utilizan interfaces

Esta clase simplemente la escribí para ejemplificar como instanciar las clases que implementan las interfaces y como obtener la referencia de una interfaz; observa que esto se hace en el método main para poder ejecutar esta clase. La salida en Netbeans después de ejecutar la clase anterior es la siguiente:

Entender el concepto de interfaz es importante ya que Spring fomenta la programación orientada a interfaces. Tan es así que el Core y en general todos los módulos de Spring utilizan bastante las interfaces ya que utilizarlas se considera una buena practica de programación.

Si deseas los fuentes expuestos en este articulo los puedes bajar en un proyecto de Netbeans desde este repositorio de GitHub. En el próximo articulo haré la ultima entrega de este tema (Conceptos básicos de Java & Spring Framework) y hablare sobre las colecciones, como usarlas y porque son tan importantes para iniciar el aprendizaje de Spring.

Hasta pronto,
Saludos.

Trackbacks / Pings

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *