Uso Interfaces en Java
Uso Interfaces en Java
Hace no demasiado tiempo fuí a una entrevista de trabajo como desarrollador Java. Como programador con relativa
experiencia en Java pensaba que todo estaría bajo control en la parte técnica. Me equivoqué.
Una de las p reguntas que me hicieron fue: ¿cuando usas interfaces y cuando herencia a la hora de diseñar software?.
Realmente no me lo esperaba, hasta ahora para mi era una cuestión de intuición (al igual que para muchos otros) más
que un tema racional. Solo acerté a a explicar las diferencias entre una cosa y otra, con los nervios ni tan siquiera me
vino a la cabeza la mas conocida de todas las razones, la herencia múltiple, y mi interlocutor dijo que el también
conocía el lenguaje, pero que quería saber el por qué.
Como tenía intención de cambiar de trabajo, quería preparame mejor para el resto de las entrevistas, y aunque fuera
poco probable que me volvieran a hacer la misma pregunta, como cuestión personal, decidí buscar mi propia respuesta
a este tema, y aquí esto y, contando lo que he encontrado.
Herencia
Como he dicho antes, la primera y más conocida función del uso de interfaces es la de resolver el problema de la
herencia múltiple presente en otros legunajes, como por ejemplo C++. Los interfaces de Java, al separar la forma del
como (la declaración del código que lo implementa) permiten la herencia multiple sin los problemas típicos que se
pueden plantear para decidir que implementación usar cuando una clase hereda de dos que tienen implementaciones
distintas para la misma signatura de un método. Esta claro que tampoco es una solución "mágica" (simplemente no se
herda el código, asi que no hay que decidir cual se coge), pero es una solucióón. Pero esta no podría ser la única razón
para el uso de interfaces, ya que tampoco es la más usada (en realidad se usa bastante poco si exceptuamos
componentes gráficos que implementan varios interfaces de oyentes de eventos). Además, los "manuales de la buena
programación" dicen que los interfaces son para modelar las relaciones "tiene un", no "es un", aunque esto no siempre
se así.
Polimorfismo
Asi que me puse a pensar en las ocasiones en que yo he usado interfaces. La respuesta era fácil, cuando necesita
cierto polimorfismo, es decir, cuando necesitaba que una clase pudiera tener con los mismos métodos o atributos
distintos comportmientos, por ejemplo, una clase que pudiera almacenarse en una base de datos o en un fichero de
texto sólo cambiando el objeto que la hace persistente. Siempre que todos implementen el mismo interfa ce, la clase
puede almacenarse en cualquier tipo de dispositivo sin cambiar los métodos necesarios. Algunos dirán que esto se
podría hacer de la misma forma con algunas jerarquías de herencia, pero en mi opinión de esta forma el código es
mucho más flexible a la hora de añadir funcionalidad a la aplicación (por no mencionar la de "if" que se quitan). Ya
tenía dos razones.
Diseño
Entonces, viendo el funcionamiento de algunos grandes proyectos caí en una tercera razón, que quizas tiene menos
que ver con la p rogramación en primera instancia, pero que es de enorme importancia para el diseño (para el buen
diseño) de aplicaciones. Los interfaces de Java son (o pueden ser) el contrato entre distitnas partes de una aplicación,
o entre los distintos programadores de una aplicación.
Si se discuten y diseñan unos buenos interfaces entre los distintos componentes de la aplicación en la primera parte
del desarrollo, los diferentes grupos de trabajo pueden trabajar en paralelo sin tener que preocuparse de lo que hacen
o ya han hecho el resto, y para los test es bastante facil escribir un par de clases de prueba que implementen esos
interfaces. De esta forma, la intergración entre las distintas partes de la aplicación ya esta hecha desde un principio,
sin tener que andar consultando de que métodos se dispone para llevar a cabo una labor, y los grupos de desarrollo se
solo tienen que preocuparse de que la implementación de su parte sea el orgullo del proyecto ;-).
Además, el uso de interfaces, debido a la propia naturaleza de Java, hace que sea tremendamente fácil encontrar las
clases que se ven afectadas por una cambio brusco en alguna parte de la aplicación, ya que lo hará el compilador sólo.
Y eso es todo, por ahora me he quedado satisfecho, en la próxima entrevista ya t endré claro que contestar, pero
espero que todo aquel que tenga nuevas ideas para el uso de interfaces me las haga llegar.
Alberto Molpeceres es ahora mismo desarrollador de aplicaciones en ámbito cliente/servidor para la empresa T-
Systems - debis Systemhaus en Munich (Alemania).
Cuando no está trabajando o "metiendo caña" al resto de los integrantes de javaHispano intenta pasear con su novia,
buscar la desaparecida lógica del idioma alemán o intenta olvidar la pesadilla que es buscar piso en Munich.
Para cualquier duda o tirón de orejas, e -mail a: [email protected]