jueves, 28 de abril de 2011
viernes, 15 de abril de 2011
Puntos clave del tema 3
Estos son los puntos clave del tema 3:
- Manejo de situaciones anómalas
- Aserciones
- Excepciones
- Lanzamiento y captura
- Definición de excepciones
- Interfaces
- Interfaces comunes
- Herencia y polimorfismo
- Herencia de clases
- Polimorfismo
- Clases abstractas
- Genéricos
viernes, 8 de abril de 2011
Serialización de objetos Java
Los objetos que creamos en Java no sólo viven en la memoria del ordenador. Java permite convertir un objeto en memoria en un grupo de bytes para después convertir de nuevo ese grupo de bytes en un objeto en memoria (lo que se llama serializar y deserializar, respectivamente).
Las utilidades de esto son todas las que se nos ocurran. Desde persistir objetos en ficheros para utilizarlos más allá de la ejecución del programa a enviar un objeto a través de una red para utilizarlo en un programa Java en otro ordenador.
Para indicar que una clase es serializable, ha de implementar la interfaz Serializable (como no). Y, en caso de que uno de los atributos de la clase sea a su vez un objeto, la clase de dicho objeto tiene también que implementar dicho interfaz.
Tenía pensado contar más detalles acerca de la serialización, pero me he encontrado con una guía muy buena sobre la serialización en Java en ChiWiki que incluye lo que pensaba contar y más.
Y, por su puesto, nunca viene de más consultar la documentación de Java sobre serialización.
Las utilidades de esto son todas las que se nos ocurran. Desde persistir objetos en ficheros para utilizarlos más allá de la ejecución del programa a enviar un objeto a través de una red para utilizarlo en un programa Java en otro ordenador.
Para indicar que una clase es serializable, ha de implementar la interfaz Serializable (como no). Y, en caso de que uno de los atributos de la clase sea a su vez un objeto, la clase de dicho objeto tiene también que implementar dicho interfaz.
Tenía pensado contar más detalles acerca de la serialización, pero me he encontrado con una guía muy buena sobre la serialización en Java en ChiWiki que incluye lo que pensaba contar y más.
Y, por su puesto, nunca viene de más consultar la documentación de Java sobre serialización.
viernes, 1 de abril de 2011
Más allá del println
Si queréis llevar vuestra depuración de código a otro nivel, sin tener que recurrir continuamente al System.out.println, podéis utilizar una librería de manejo de trazas.
Estas librerías os permiten manejar trazas de ejecución de los programas que hagáis, evitando mostrar siempre los mensajes por la consola, y además definen distintos niveles de mensajes para poder elegir con qué detalle se quiere almacenar la traza.
El propio Java viene con un manejador de trazas (Logger), no obstante el más utilizado es Log4J y es el que os voy a presentar a continuación.
Para utilizar Log4J en un proyecto, lo primero que hay que hacer es incluir en dicho proyecto el jar con las librerías de Log4J que os podéis descargar de la página del proyecto.
El funcionamiento básico es definirse un objeto de tipo Logger llamando a su constructor y pasándole como parámetro el nombre que le queramos dar (si en vez de un nombre le pasamos una clase, utilizará el nombre de la clase).
Después tenemos que configurar cómo queremos manejar la traza. Esto se puede hacer o utilizando un fichero de configuración o desde el mismo código. Lo más recomendable es utilizar un fichero de configuración; no obstante, para este ejemplo utilizaremos el configurador por defecto que nos muestra las trazas de todos los niveles por la consola.
A partir de aquí, podremos utilizar distintos métodos para almacenar nuevas trazas con distintos niveles. Log4J tiene los siguientes niveles de traza (definidos como constantes de la clase org.apache.log4j.Level):
Y cada uno de dichos niveles tiene un método que almacena una traza en dicho nivel.
Si quisiéramos mostrar sólo a partir de cierto nivel, se podría también indicar tanto en el código como en el fichero de configuración. Por ejemplo la siguiente linea mostraría sólo las trazas de nivel INFO y superiores (WARN, ERROR y FATAL).
Si ejecutamos el siguiente ejemplo
podremos ver por la consola la siguiente salida donde se muestran las distintas trazas y sus correspondientes niveles.
Una vez hemos acabado de depurar el programa, no hace falta que eliminemos ni una linea de código, con poner el nivel ERROR ya solo nos aparecerán aquellas trazas que muestren errores en el programa.
Log4J permite hacer muchas más cosas que las que se mencionan aquí, con lo que os animo echar un vistazo a su documentación y a los tutoriales disponibles en la Web.
¿Qué os parece esta alternativa al println?
¿Creéis que la usaréis en un futuro cercano?
Estas librerías os permiten manejar trazas de ejecución de los programas que hagáis, evitando mostrar siempre los mensajes por la consola, y además definen distintos niveles de mensajes para poder elegir con qué detalle se quiere almacenar la traza.
El propio Java viene con un manejador de trazas (Logger), no obstante el más utilizado es Log4J y es el que os voy a presentar a continuación.
Para utilizar Log4J en un proyecto, lo primero que hay que hacer es incluir en dicho proyecto el jar con las librerías de Log4J que os podéis descargar de la página del proyecto.
El funcionamiento básico es definirse un objeto de tipo Logger llamando a su constructor y pasándole como parámetro el nombre que le queramos dar (si en vez de un nombre le pasamos una clase, utilizará el nombre de la clase).
Logger miLogger = Logger.getLogger("programa.logger");
Después tenemos que configurar cómo queremos manejar la traza. Esto se puede hacer o utilizando un fichero de configuración o desde el mismo código. Lo más recomendable es utilizar un fichero de configuración; no obstante, para este ejemplo utilizaremos el configurador por defecto que nos muestra las trazas de todos los niveles por la consola.
BasicConfigurator.configure();
A partir de aquí, podremos utilizar distintos métodos para almacenar nuevas trazas con distintos niveles. Log4J tiene los siguientes niveles de traza (definidos como constantes de la clase org.apache.log4j.Level):
- FATAL. Errores serios que harán que la aplicación interrumpa su ejecución
- ERROR. Errores con los que la aplicación podría continuar su ejecución
- WARN. Situaciones potenciales de error
- INFO. Mensajes generales de diagnóstico del progreso de la aplicación
- DEBUG. Mensajes específicos de diagnóstico del progreso de la aplicación
- TRACE. Mensajes mucho más específicos sobre la aplicación
Y cada uno de dichos niveles tiene un método que almacena una traza en dicho nivel.
public void debug(Object message)
Si quisiéramos mostrar sólo a partir de cierto nivel, se podría también indicar tanto en el código como en el fichero de configuración. Por ejemplo la siguiente linea mostraría sólo las trazas de nivel INFO y superiores (WARN, ERROR y FATAL).
logger.setLevel(Level.INFO);
Si ejecutamos el siguiente ejemplo
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
public class ClaseEjecutable {
public static void main(String[] args) {
Logger miLogger = Logger.getLogger("programa.logger");
BasicConfigurator.configure();
miLogger.info("Inicio de la ejecución");
String cadena = "Cadena de texto";
int numero = 1;
cadena = cadena + numero;
if (cadena.equals("Cadena de texto1")){
System.out.println("La cadena calculada es: " + cadena);
miLogger.debug("La concatenación ha funcionado");
} else {
miLogger.debug("La concatenación no ha funcionado");
}
miLogger.info("Fin de la ejecución");
}
}
podremos ver por la consola la siguiente salida donde se muestran las distintas trazas y sus correspondientes niveles.
0 [main] INFO programa.logger - Inicio de la ejecución La cadena calculada es: Cadena de texto1 1 [main] DEBUG programa.logger - La concatenación ha funcionado 1 [main] INFO programa.logger - Fin de la ejecución
Una vez hemos acabado de depurar el programa, no hace falta que eliminemos ni una linea de código, con poner el nivel ERROR ya solo nos aparecerán aquellas trazas que muestren errores en el programa.
Log4J permite hacer muchas más cosas que las que se mencionan aquí, con lo que os animo echar un vistazo a su documentación y a los tutoriales disponibles en la Web.
¿Qué os parece esta alternativa al println?
¿Creéis que la usaréis en un futuro cercano?
jueves, 24 de marzo de 2011
Depuración de Java con Eclipse
En esta entrada voy a intentar dar unas primeras nociones de cómo facilita Eclipse la depuración de código. En su modo de depuración, Eclipse nos permite ejecutar paso a paso el código y analizar el contenido de las variables.
Lo primero que hay que hacer es definir en qué punto o puntos del código queremos que la ejecución del programa se pause. Para ello, definiremos puntos de ruptura (breakpoints) en las lineas de código donde queramos que la ejecución pause.
Para definir un punto de ruptura (o para eliminar uno existente), nos situamos en la linea que queramos y seleccionamos "Run -> Toggle breakpoint" o hacemos doble-click en la barra a la izquierda de la ventana del código. Al definir un punto de ruptura aparecerá en dicha barra un punto, tal y como se puede ver en la figura.
Una vez tenemos definidos los puntos de ruptura que queramos, iniciamos el depurador seleccionando desde una clase ejecutable "Run -> Debug" o, alternativamente, dando al botón con el bicho:

Lo primero que vemos es que el Eclipse cambia de la perspectiva Java a la Perspectiva Debug. En esta perspectiva, además de el código fuente, el esquema o la consola, podemos ver la información de las variables y una ventana donde se muestran los hilos de ejecución.
En la siguiente imagen podemos ver cómo la ejecución se ha detenido en la linea 14 del main (donde habíamos definido el punto de ruptura) y cómo dicha linea aparece marcada en el código fuente. En la figura podemos ver el contenido de las variables y objetos que existen en el momento en que se ha pausado la ejecución, lo cual nos va a ayudar mucho en la depuración.
Además, podemos indicar que la ejecución siga o se detenga a nuestro gusto utilizando los botones de la vista Debug (o las opciones del menú "Run"). A continuación explicamos las básicas.
Resume. Continúa la ejecución del programa hasta el próximo punto de ruptura o hasta que finaliza la ejecución.
¿Qué os parece? ¿Pensáis que sabiendo cómo depurar el código programaréis mejor?
jueves, 10 de marzo de 2011
Puntos clave del tema 2
Estos son los puntos clave del tema 2:
- Programación modular
- Qué es y para qué sirve un módulo
- Creación de módulos
- Utilización de módulos
- Paquetes
- Creación de paquetes
- Utilización de paquetes
- Ocultación de información
- Cohesión y acoplamiento
- Modificadores de acceso
martes, 1 de marzo de 2011
Trabajar en Eclipse con los proyectos en un lápiz de memoria
Muchas veces nos puede interesar tener nuestros proyectos de Eclipse en un lápiz de memoria y trabajar directamente sobre el lápiz en vez de sobre el disco duro.
Esto nos puede ser útil para ir de un lado a otro con el código o para evitar perder el trabajo si se va la luz de repente en el aula informática durante un exámen. :)
No obstante, tener en cuenta que la velocidad de acceso al lápiz de memoria va a ser menor que la de acceso al disco duro y que la probabilidad de que un lápiz de memoria se estropee es mayor que la de un disco duro. Es decir, que hagáis copias se seguridad del contenido del lápiz de memoria de vez en cuando.
La forma más conveniente de trabajar en Eclipse teniendo los proyectos en un lápiz de memoria es utilizando los workspaces de eclipse. Un workspace no es más que un directorio que contiene los proyectos, directorios y ficheros que se pueden utilizar en Eclipse.
Los pasos a seguir son los siguientes:
1.- Conectar el lápiz de memoria al ordenador.
2.- Crear un directorio en el lápiz donde se va a localizar el workspace.
3.- Cambiar el workspace actual por el directorio que hemos creado en el lápiz.
File -> Switch Workspace -> Other...
4.- Una vez hecho esto, se reiniciará el Eclipse y tendremos el nuevo workspace vacío sobre el que podemos crear nuestros proyectos.
Por último, recordad que si en cualquier momento queréis saber dónde se encuentran almacenados en el disco duro los ficheros de vuestro proyecto, solo tenéis que ir a las propiedades del proyecto.
Project -> Properties -> Resource -> Location
Esto nos puede ser útil para ir de un lado a otro con el código o para evitar perder el trabajo si se va la luz de repente en el aula informática durante un exámen. :)
No obstante, tener en cuenta que la velocidad de acceso al lápiz de memoria va a ser menor que la de acceso al disco duro y que la probabilidad de que un lápiz de memoria se estropee es mayor que la de un disco duro. Es decir, que hagáis copias se seguridad del contenido del lápiz de memoria de vez en cuando.
La forma más conveniente de trabajar en Eclipse teniendo los proyectos en un lápiz de memoria es utilizando los workspaces de eclipse. Un workspace no es más que un directorio que contiene los proyectos, directorios y ficheros que se pueden utilizar en Eclipse.
Los pasos a seguir son los siguientes:
1.- Conectar el lápiz de memoria al ordenador.
2.- Crear un directorio en el lápiz donde se va a localizar el workspace.
3.- Cambiar el workspace actual por el directorio que hemos creado en el lápiz.
File -> Switch Workspace -> Other...
4.- Una vez hecho esto, se reiniciará el Eclipse y tendremos el nuevo workspace vacío sobre el que podemos crear nuestros proyectos.
Por último, recordad que si en cualquier momento queréis saber dónde se encuentran almacenados en el disco duro los ficheros de vuestro proyecto, solo tenéis que ir a las propiedades del proyecto.
Project -> Properties -> Resource -> Location
Suscribirse a:
Entradas (Atom)










