Buscar
Social
Ofertas laborales ES
« Artículo sobre "Memory leaks" en Java | Main | Javacup 2009: Disponibles proyectos para eclipse y netbeans »
martes
mar172009

Programar mediante la coincidencia: el caso de JBoss 5.0 GA

Una de las cosas sobre las que el libro del programador pragmático advierte es sobre "programar por coincidencia". Esto se aplica a aquellos programadores que toquetean el código hasta que funciona, pero realmente no están seguros de lo que hace y no se han molestado en asegurarse si su código realmente funciona, o funciona ahora mismo por casualidad.

Vitaly Mikheev describe uno de estos problemas, ni más ni menos que con el JBoss 5.0 GA. El servidor de aplicaciones funciona perfectamente en el JRE de Sun, pero tan siquiera arranca en el de IBM, el de Oracle o el de Excelsior. La verdad, es sorprendente que no hubiesen testeado el servidor de aplicaciones con otros JRE antes de ponerle la etiqueta de "GA". Cualquier programador Java con experiencia debería saber que aunque todos los JRE hayan pasado el mismo test de compatibilidad, no quiere decir que se tengan que comportar de modo idéntico.

En este caso, el problema viene de que al usar el API de reflexión JBoss espera que un determinado método que devuelve los constructores de una clase devuelva dichos constructores en un orden predeterminado, mientras que la especificación dice de modo claro que estos constructores pueden devolverse en cualquier orden. Por casualidad, resulta que el JRE de Sun los devuelve en el orden que ellos esperan (casualidad que seguramente se basa en que ese es el JRE empleado en el desarrollo del servidor). Esto no sucede en los demás JREs, por lo que el servidor tan siquiera arranca.

A mí me tienen sucedido cosas parecidas. En su día, hice una aplicación Swing en Java 1.2 con el JDK de Sun. Funcionaba perfectamente. Cuando salió el JDK 1.4 de Sun mi aplicación no pintaba la pantalla, y provocaba un pico de CPU del 100%. El problema es que dentro de un método paintComponent() estaba llamando al método setSize(). No sé cómo se gestionaba esto con los JDKs 1.2 y 1.3, pero en el 1.4 (como parece lógico) cambiar el tamaño de un componente hace que se vuelva a pintar, y mi método de pintar le volvía a cambiar el tamaño, lo que hacía que se volviese a pintar...

Mi error, al igual que el de JBoss, tiene su raíz en conformarse con que el código funcione y no haberse molestado en comprender realmente lo que hace y cómo funciona el API que estás empleando. ¿Alguien más ha tenido experiencias similares a estas ? 

Reader Comments

There are no comments for this journal entry. To create a new comment, use the form below.
Comentarios deshabilitados
Comentarios deshabilitados en esta noticia.