sábado, 28 de febrero de 2009

Reference notes and insides of a while

  Algo con lo que me topé mucho cuando estuve realizando la aplicación cliente servidor y que en un momento dado me llegó a desesperar, fueron en realidad dos cosas, dos errores que impedían el funcionamiento de la aplicación, pero que permitían que compilara y que "corriera" hasta cierto punto, de manera adecuada.

 El primero fue que la aplicación se trababa y dejaba de "funcionar" al apretar el botón que permitía escuchar lo que la otra parte (el cliente si estabas en el servidor o el servidor si estabas en el cliente) decía y así, poderle responder.
 Durante el debug descubrí que el programa no había dejado de funcionar, seguia corriendo, pero esperaba respuesta de la otra parte. Se había quedado atorado en el ciclo while.
 De alguna manera eso era algo que se suponía debía pasar, pues debe escuchar y recibir todo lo que le manden. Pero también debía permitir al usuario emitir las respuestas.
 La solución en realidad era sencilla, pero no me fue facil dar con ella, había que sacar el ciclo while de la aplicación que permitía al usuario interactuar, pero permitirle a esa aplicación intervenir en los eventos que generaba el while.
 Por lo tanto, el capitán tenía que tener un barco y el barco tenía que tener un capitán, lo que nos llevó al siguiente problema.

 Los objetos en java, siempre se pasan como referencia, y los nativos como valor; o eso es lo que yo creía.
 Al crear un barco, el constructor pedía especificar un capitá (The ship must allways have a captain) y el constructor del capitán pedía siempre un barco (pues todo capitán es capitán de un barco, no?).
 Y entonces surge el problema de las gallinas y los huevos. Mi primer intento de solución fue declarar un capitán y crear un barco, para después crear al capitán, en fin que los objetos se pasan como referencias. Pero no, el compilador me pedía que el capi´tan estuviera inicializado antes de crear el barco.
 Al inicializarlo con null, me mandaba NullPointerException cada que quería llamar al capitán del barco... lo que me parecía increíble, pues yo había creado al capitán con el barco anterior.
 El debug me mostró que el barco tenía un capitán nulo, aunque yo hubiera creado ese "mismo" capitán.

 La solución me tomó más tiempo, pero el resultado fue un valioso pedazo de conocimiento.

  Los objetos, como argumento en un método, pasan como referencia y los nativos como valor.
  Pero NUNCA en un constructor!!!!!


 Creé el barco y el capitán por separado, modificando el constructor, y después los agregué mutuamente.

No hay comentarios:

Publicar un comentario