lunes, 2 de marzo de 2009

Algunas curiosidades ...





Durante mi preparación del examen de certificación de Java tuve que comenzar a analizar código y fijarme en detalles en los cuales nunca antes había ni siquiera pensado en fijarme. Muchas veces decimos que manejamos un lenguaje bien porque hemos programado un par de aplicaciones en él y con eso nos sentimos "expertos", pero de ser "experto" a conocer el lenguaje es otra cosa ... este post va dedicado a un par de curiosidades de ese tipo que encontré y la idea es que quienes se interesen traten de responder a las preguntas sin necesidad de compilar ... si, si sé, ustedes dirán ... pero cómo voy a responder si yo no soy un compilador ... pero dejenme decirles que justamente ahí está la gracia ... las primeras veces, las respuestas que damos no están ni cerca de lo correcto, pero luego aprendes y luego te basta con mirar un trozo de código y saber cuál podría ser la razón del problema ... y creanme que se los digo por experiencia propia ... yo siempre me he definido como una persona auto-didacta y nunca, mientras estudiaba, me quedaba simplemente con lo que los profesores nos entregaban en clases ... y creo que eso me ha ayudado a aprender todo lo que sé ... así es que si las primeras respuestas a las preguntas "capciosas" que acá voy a ir dejando de los distintos lenguajes en los cuales me va a tocar trabajar este año no son en un principio correctas, no importa, sigan intentando y se van a dar cuenta de que, poco a poco, van a ir ganando terreno en el lenguaje.

Bueno, después de esta breve introducción :-o ... vamos con la primera pregunta:

Observando el siguiente código, ¿qué debería imprimir?

Se trata de un ejemplo del uso de colecciones usando Generics y el tratamiento de los métodos característicos de tratamiento de colecciones: add y delete.

Dentro de las posibles respuestas están 0 y 100. Según lo que se lee se agregan y se quitan elementos a la colección que hemos creado. Se entiende que agrega un elemento y debería eliminar el elemento anterior ... y fíjense que en la primera iteración debería eliminar el número 0. La colección es un objeto HashSet que se almacena en un objeto declarado como Set ... ¿saben lo que imprime?, pero la mejor pregunta es: ¿pueden justificar la respuesta? ... la respuesta la voy a dejar stand-by y la respuesta la daré en el próximo post ... a ver si llegan algunos comentarios dando la opinión de por qué creen que imprime lo que imprime.

El código que sigue si que es curioso y ha sido uno de los que más me ha desconcertado ... jejeje, observen:

En este caso la pregunta de rigor es: ¿por qué imprime lo que imprime en la salida estándar?

La respuesta pasa por el comportamiento del null cuando se asigna a un objeto. El constructor de la clase Uno se encuentra sobrecargado y la clase Object tiene mayor prioridad, recuerden que la clase Object es la clase raíz (la clase padre de todas las clases) y por lo mismo está en el mayor nivel de jerarquía. La pregunta que debería quedar ahora es lo que se debería hacer para que imprima un "2" en la salida estándar, es decir, para que se ejecute el segundo constructor de la clase Uno.

Finalmente, una utilidad, han leído algo sobre la clase TestCase ... bueno acá hay una aplicación de esa clase ... permite trabajar con casos de prueba para ir depurando nuestros métodos ... si bien es cierto las aserciones es muy poco probable que aparezcan en la prueba de certificación no es malo saber cómo funcionan.

Para poder probar el código anterior necesitan el .jar asociado a junit, el cual lo pueden encontrar en el siguiente link.


Bueno, creo que eso sería mi primer post ... relacionado con Java, luego vendrán otros en .NET y C para ir variando un poco ... todos con algunas curiosidades y utilidades que nos ayuden a conocer más los lenguajes de programación.

Saludos a todos y que Dios los bendiga

Bye