Quantcast
Channel: CoDejaVu
Viewing all 129 articles
Browse latest View live

Leer Archivo Properties en Java

$
0
0
En el segundo Post de este blog se mencionó la intención de publicar entradas sobre diversos temas, algunos complejos otros no tanto.........hasta aquí se han publicado cositas no tan complejas pero que pueden llegar a ser enredadas o de cuidado.

En esta ocasión veremos una entrada sobre algo simple y fácil de entender pero que nos puede ser de mucha ayuda.


Veremos de forma breve como trabajar con un archivo de propiedades desde java, estos archivos son simplemente ficheros de texto que podemos usar para almacenar información, inicializar variables, establecer mensajes o en general definir parámetros (en tutoriales anteriores hicimos uso de este tipo de archivos para definir rutas de servidores o parametros de configuración).

En java trabajaremos con java.util.Properties donde básicamente necesitamos especificar nuestros parámetros mediante la combinación "Clave - Valor" y usar los métodos básicos que esta clase nos proveé, un ejemplo simple puede darse con el tema de la internacionalización, podemos crear archivos properties para definir todos los labels o etiquetas que usaremos en la aplicación para diferentes idiomas y dependiendo del idioma que escogemos buscamos el valor a presentar en pantalla en su archivo correspondiente.

Otro ejemplo es que en la empresa donde trabajo nos encontramos desarrollando una aplicación que genera una serie de reportes de Excel y se deben almacenar en unas rutas especificas, son muchos reportes que se almacenan en rutas diferentes, por eso podríamos hacer que esas rutas de directorios se puedan parametrizar en un archivo properties y no  quemadas en código.

Empecemos!!!

Para este caso vamos a crear un proyecto Java básico, donde definiremos dos paquetes, uno para las clases y otro para el archivo.properties.


Luego desde el paquete properties damos click derecho y creamos un nuevo archivo de propiedades.


Se carga una ventana donde ingresamos archivo.propierties, siendo este el nombre y la extensión del archivo.


Después de esto ya contamos con un panel donde podemos editar el archivo de propiedades, presionando el botón Add podemos empezar a agregar parámetros con la combinación Clave - Valor.


 O desde la vista Source podemos agregarlos directamente.


Para poder acceder a estos datos desde el código fuente, haremos uso de los métodos load y getProperty que nos provee la clase Properties.

En la clase principal de nuestra aplicación creamos un método donde realizaremos el cargue y obtención de datos desde el archivo de propiedades.

package clases;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

/**
* @author CHENAO
*
*/
public class Principal {

public static void main(String arg[]) {

Principal miPrincipal = new Principal();
miPrincipal.leerArchivo();
}

/**
* Lee un archivo de propiedades desde una ruta especifica
* y se imprime en pantalla.
*/
private void leerArchivo() {
try {

/**Creamos un Objeto de tipo Properties*/
Properties propiedades = new Properties();

/**Cargamos el archivo desde la ruta especificada*/
propiedades
.load(new FileInputStream(
"D:/HENAO/codejavu/Workspace/PruebaProperties/src/properties/archivo.properties"));

/**Obtenemos los parametros definidos en el archivo*/
String nombre = propiedades.getProperty("nombre");
String pagina = propiedades.getProperty("pagina");

/**Imprimimos los valores*/
System.out.println("Nombre: "+nombre + "\n" +"Pagina: "+ pagina);


} catch (FileNotFoundException e) {
System.out.println("Error, El archivo no exite");
} catch (IOException e) {
System.out.println("Error, No se puede leer el archivo");
}
}
}




Al correr nuestra aplicación podemos ver como se obtienen los datos desde la ruta enviada en el método load.

si queremos podemos almacenar el archivo en otra ruta, por ejemplo la del servidor de aplicaciones y luego enviarla como parámetro...................................... al final la salida es


Y listo, ya obtuvimos los datos desde el archivo de propiedades, la clase Properties nos provee mas métodos que podemos utilizar dependiendo de lo que necesitemos hacer, podemos sobre-escribir los valores, almacenar datos en otro fichero entre otros...
Mas adelante publicare otras cositas sencillas pero de Utilidad.


También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Instalación JDK

$
0
0
Creo que esta será una de las entradas mas básicas del Blog, no pensaba vincularla hasta que una persona interesada en aprender Java me dijo que tenia problemas con la instalación, entonces si a esta persona le pasa, puede que a muchos también, por eso me decidí a crear un espacio en el blog para uno de los puntos mas básicos pero importantes cuando se trabaja con Java o Herramientas que requieran de su maquina Virtual.



Además en casi todos los tutoriales anteriores (y próximos) hablamos del JDK como prerrequisito, entonces he aquí una entrada para la famosa instalación :)

Definición.

No Vamos a profundizar en la historia y características del JDK, solo presentaremos la definición básica de lo que es y como es el proceso de instalación, para esto nos vamos a apoyar en la definición que nos brinda Wikipedia :

"Java Development Kit o (JDK), es un software que provee herramientas de desarrollo para la creación de programas en Java. Puede instalarse en una computadora local o en una unidad de red."

como vemos, básicamente el JDK es el conjunto de herramientas que nos permiten desarrollar en Java, sin el JDK no podríamos compilar, ejecutar o desplegar nuestras aplicaciones, también hay que tener en cuenta que cuando lo instalamos por defecto se instala el JRE (Java Runtime Environment), sin este no podríamos usar programas basados en Java (como algunos que veremos en entradas futuras).............. sin estas herramientas por ejemplo no podríamos desplegar el JBoss que venimos usando y ni siquiera IDE's como Eclipse o Netbeans.

Instalación.

Inicialmente descargamos el instalador desde la página de Oracle aquí escogemos la distribución que deseamos instalar, para este caso vamos a bajar el jdk 6.


Desde la página tenemos la opción de bajar el JDK o el JRE, como dijimos anteriormente el JDK nos brinda las herramientas, programas, y librerías necesarias para desarrollar aplicaciones Java y el JRE nos permite la ejecución de dichas aplicaciones,  por ende si solo instalamos este último podríamos ejecutar pero no desarrollar, en este caso como queremos tener nuestro ambiente de desarrollo, vamos a instalar el JDK el cual tiene el JRE incluido.

al ingresar al linck, se carga otra pagina donde debemos aceptar los términos de licencia y seleccionar el linck correspondiente al sistema operativo sobre el cual estamos trabajando, como vemos tenemos un JDK por cada sistema operativo y  su correspondiente distribución, escogemos el que queremos descargar.


Después de esto, aparece una ventana de descarga, bajamos el JDK y lo almacenamos en cualquier directorio de nuestra maquina.


Ahora con el instalador en nuestro equipo solo nos queda ejecutarlo y realizar el proceso de siguiente siguiente para instalar la herramienta.


Al final si todo ha salido bien (nunca he visto que no salga bien a menos que el instalador este dañado) se presenta la última ventana de instalación informándonos que la herramienta fue instalada satisfactoriamente en la ruta definida en la ventana 4 del paso anterior.


y listo, ya tenemos instalado el JDK en nuestra máquina, ahora solo nos falta definir la variable de entorno JAVA_HOME apuntando a la ruta de instalación.


y eso es todo, ya tenemos JDK instalado y configurado en nuestra máquina.....

Integración Continua, Primeros Pasos Con Jenkins

$
0
0

Hace muy poco estoy involucrado con el tema de la Integración continua, específicamente interactuando con los aplicativos Jenkins y Sonar, donde he tenido que trabajar contra reloj y resolver "problemas" (que nunca faltan en esta profesión) pero que gracias a la ayuda de compañeros con experiencia y mucho tiempo entre practicas, pruebas y consultas se han podido resolver.


En la red hay mucha documentación sobre el tema aunque no muy fácil de encontrar, por ese motivo quise vincular al blog algunos conceptos básicos sobre la integración continua y el uso de estas herramientas, no soy experto en el área (que mas quisiera)  pero me interesa conocer aun mas y brindar un poquito de colaboración a los que como yo estamos iniciando en este proceso, por eso intentaré explicar los términos y herramientas basado en mi experiencia personal y como se indicó en la presentación de este blog, usando un lenguaje natural.................

En Marcha!!!

Primero vamos a trabajar con Jenkins, peroantes de iniciar con el eje central de este tutorial debemos tener claro el termino Integración Continua (continuous integration). 

En torno al desarrollo de software, yo lo defino básicamente como un proceso de revisión y control de código donde el objetivo principal es ejecutar tareas automáticas que analicen y prueben el código fuente de un proyecto para detectar posibles fallos en el mismo, una de las muchas ventajas es que al ser de forma automática reduce el tiempo que una persona tendría que invertir para encontrar estos defectos, pudiendo dedicarse a sus labores específicas..........

Teniendo esto claro empecemos con Jenkins......

JENKINS, Lo Básico...

Vamos a ver en términos rápidos y generales algunas características básicas sobre Jenkins, principalmente lo que debemos saber sobre la herramienta para dar paso a trabajar con ella, no profundizaremos en su Historia, creadores, arquitectura u Orígenes, simplemente hablaremos de lo principal como cultura general.

- Jenkins es un software de integración continua de código abierto escrito en Java, anteriormente conocido como Hudson, con esta herramienta podremos desplegar nuestro código en un servidor donde será compilado y testeado.

- Por medio de Jenkins podemos configurar la forma en la que queremos analizar el código fuente de nuestro proyecto e integrar la herramienta con otras aplicaciones para hacer un análisis profundo de los resultados obtenidos, tales como generación de reportes, gráficos o contar líneas de código entre otras.

- Jenkins tiene soporte para sistemas de control de versiones, algunas como SVN, CVS, Git y corre en un servidor de aplicaciones como por ejemplo Tomcat o Jboss permitiendo la ejecución de proyectos Ant y Maven.

- Con Jenkins basado en el concepto de integración contina, cada vez que un desarrollador del equipo de trabajo realice un cambio sobre el código fuente, el sistema mediante la ejecución de sus tareas automáticas podrá revisar dichas actualizaciones y determinar su correcto funcionamiento o posibles fallos en el código.

- Facilita el seguimiento a procesos, encontrar defectos y la toma de decisiones sobre inconsistencias o mejoras en el software.

- Integra al equipo de trabajo, facilita la organización, estabilidad y calidad del proyecto.

Las anteriores son algunas caracteristicas basicas del Aplicativo, como vemos esta es una pequeña y rapida introducción de la Herramienta, tal vez un poco confusa pero con una gran aplicación, desde la página oficial de Jenkins se puede consultar mas información, acceder a su wiki, comunidad, foros y herramientas ingresando a http://jenkins-ci.org/  

Mas adelante revisaremos algunas entradas sobre el trabajo con la herramienta y de esta forma dar los primeros pasos en el mundo de la Integración continua.......


También te podría Interesar. 



¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Instalación Jenkins en Windows.

$
0
0
Iniciamos con la Instalación de Jenkins en Windows, asumiremos que conoce lo que es un servidor de aplicaciones y que tiene su máquina con el ambiente necesario para realizar la instalación, en este caso básicamente necesitaría tener un servidor y un JDK instalado, en este ejemplo trabajaremos con el  jdk1.6.0_22 y con el servidor de aplicaciones jboss-4.2.3.GA (Si no tiene el ambiente necesario puede seguir los tutoriales para instalar el JDK y el Servidor JBoss presionado aquí y aquí.)

La instalación de Jenkins se puede hacer de dos formas, la primera es descargando y ejecutando el asistente de instalación desde la página principal http://jenkins-ci.org/y seleccionando el sistema operativo desde el que vamos a trabajar, o simplemente descargando él .war desde la misma página como lo haremos a continuación.

Requisitos de Instalación. 

- JDK1.6.0_22 
- JBoss-4.2.3.GA 
- Jenkins.war

Instalación.

Descargue el Jenkins.war  desde la página principal de Jenkins presionando la opción  “Latest and greatest” (Al descargarlo como un fichero war se puede ejecutar en cualquier sistema operativo). 




Ingrese al servidor Jboss  y copie el Jenkins.war en la carpeta deploy.


Establezca la variable de entorno JENKINS_HOME con la ruta donde quedaran almacenados los archivos de generación del Jenkins, además del código fuente que se descargará al ejecutarse las tareas automáticas (se recomienda un directorio que contenga suficiente espacio de memoria, tenga en cuenta que Jenkins no requiere de una base de datos, los archivos necesarios para su funcionamiento son almacenados en el disco).



Despliegue de Jenkins.

Para el despliegue, ejecutar el run.bat desde la carpeta bin del servidor jboss


Después de que despliegue completamente el servidor, ingresar a la página http://localhost:8080/jenkins/......................ahora nuestro Jenkins está listo para trabajar.


Y Listo, Hasta aquí finaliza el proceso de instalación de Jenkins, podemos verificar la ruta ingresada en la variable de entorno JENKINS_HOME y veremos los archivos generados por el aplicativo.

NOTA:
 
Tener presente que si no sube el aplicativo se debe revisar la consola del servidor para darnos cuenta de la causa, en ocasiones puede tratarse de un error por espacio de memoria,  PermGen Space.



Para esto hay que entrar al run.bat del jboss y modificar la línea donde se establecen las propiedades de memoria de la JVM (recomiendo que habrán el archivo mediante algún editor que lo soporte, para ese caso pueden utilizar Notepad++), agregando al final -Xms512m -Xmx1000m -XX:MaxPermSize=128m así.


Ya tenemos nuestro Jenkins instalado,  configurado y listo para trabajar, mas adelante veremos como realizar las configuraciones básicas sobre el aplicativo, tales como creación de usuarios y tareas entre otros....


También te podría Interesar. 



¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Opciones de Seguridad en Jenkins

$
0
0
En la entrada anterior realizamos la instalación de Jenkins en Windows, el día de hoy veremos una de las partes mas importantes en cuestiones de seguridad sobre el aplicativo, realizando configuraciones básicas y dando paso al proceso de creación de usuarios.



Configurar Seguridad.

Cuando trabajamos con Jenkins podemos hacerlo de la manera por defecto o por medio de usuarios, si escogemos la primera opción nos veremos posiblemente enfrentados a problemas en cuestiones de seguridad, pues cualquiera que ingrese al aplicativo tendría libre acceso a los proyectos, ejecuciones  o configuración en general, por eso es recomendable hacer uso de las herramientas que dispone Jenkins en torno a esto.

La primera vez que iniciamos Jenkins nos aparece una pantalla como esta:

 

Para realizar las configuraciones de seguridad, desde la página de inicio de Jenkins en el menú principal  ingresamos a la opción “Administrar Jenkins”

Acto seguido se cargara una pantalla con las opciones de administración entre las cuales podemos encontrar configuración del sistema, administración de plugins, administración de nodos entre otros, en este caso seleccionamos la opción “Configure Global Security”.


Después de esto nos carga otra pantalla con 2 opciones, seleccionamos la primera“Activar Seguridad” inmediatamente se despliega un panel con diferentes opciones de seguridad por defecto.


Desde aquí configuraremos la seguridad que queremos manejar en Jenkins, seleccionamos la opción “Usar base de datos de Jenkins” y de forma opcional podemos definir si permitimos que los usuarios se registren o no, si no definimos esta opción, entonces solo el administrador podrá registrar usuarios para el aplicativo.

Para este caso dejamos la opción “Permitir que los usuarios se registren.”

En la sección Autorización existen otras opciones, por defecto nos indica que cualquiera puede hacer cualquier acción, para este caso seleccionamos la opción “Estrategia de seguridad en el proyecto” la cual nos sirve para definir los permisos necesarios en las tareas que vamos a crear, estableciendo que usuarios pueden realizar qué acciones sobre una tarea en específico (los usuarios son asociados a las tareas al momento de su creación).

(Nota: Se encuentra también la opción “Configuración de seguridad”, es muy parecida a la anterior, a diferencia que se realiza una configuración global en todo el aplicativo, por esta razón si se escoge esta opción, al momento de crear tareas no se podrían asociar a un usuario en específico.)



Al final se tendrá configuradas las opciones de seguridad, como podemos ver en la sección de autorización podemos añadir un usuario (sin embargo aún no tenemos ninguno creado), para finalizar presionamos el botón “Guardar”.

Posteriormente el aplicativo nos redirecciona a una pagina de login donde tendremos la opción de ingresar o registrar un nuevo usuario, en la próxima entrada veremos como realizar este proceso y las diferentes formas de hacerlo desde Jenkins.


También te podría Interesar. 



¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Creación de Usuarios en Jenkins

$
0
0
En la entrada anterior definimos algunas configuraciones básicas en torno a seguridad, ahora veremos de que forma podemos crear usuarios en Jenkins.




Crear usuario Administrador.

Después de realizar los pasos anteriores, Jenkins nos redirecciona a una página de Login, donde se nos pide iniciar sesión o crear una cuenta, como vemos en la imagen, en la barra de tareas también aparecen 2 nuevas opciones: entrar y Registrarse que anteriormente no existían, esto se debe a que en el paso anterior dejamos seleccionada la opción por defecto de permitir que otros usuarios se registren.

Para registrar un nuevo usuario presionamos en “Crear una Cuenta” o “Registrarse”



Se cargará un formulario donde podremos crear la cuenta deseada.


Luego se nos informará que no estamos autenticados en el sistema, sin embargo solo basta con ingresar a alguna de las opciones y nos daremos cuenta que ya entramos con el Rol de administrador.

Crear otros usuarios.

Recordemos que al configurar la seguridad, dejamos la opción por defecto para permitir que otros usuarios se registren, de forma tal que cualquier persona se puede registrar como ya se ha explicado, en caso de que se decidiera que solo el administrador puede registrar usuarios, se realiza de la siguiente forma.

Desde la página de inicio, ingresamos a “Administrar Jenkins”, como podemos ver se generó una nueva opción de “Gestión de usuarios”.





Al ingresar se carga una página donde podremos administrar los usuarios existentes, para este caso solo tenemos creado el usuario administrador.



Para crear un nuevo usuario presionamos la opción “Crear un usuario” la cual nos carga el formulario de registro donde ingresaremos los datos de nuestro nuevo usuario, posteriormente al crear la cuenta nos envía nuevamente a la pantalla anterior donde evidenciamos el usuario creado, desde aquí podremos modificar o eliminar usuarios sin inconveniente.



Se debe tener en cuenta que anteriormente definimos la seguridad del sistema y creamos el primer usuario, el cual sería administrador, de ahí en adelante a todos los usuarios creados se les debe otorgar los permisos para navegar en la aplicación, de no ser así cuando intentemos iniciar sesión con alguno de los usuarios diferentes al admin................. el sistema nos informará mediante un mensaje de error que el usuario no tiene permisos.



Permisos a Usuarios.

Para definir los permisos de usuarios, ingresamos a “Administrar Jenkins” y seleccionamos la opción “Configure Global Security”, allí en la sección “Autorización” podemos evidenciar que existe nuestro usuario administrador con el check seleccionado (no es necesario seleccionar el resto ya que el administrador tiene permisos globales sobre la aplicación), posteriormente podemos añadir el nuevo usuario creado en el paso anterior y establecer los permisos deseados.




Y eso es todo!!!!.....................Hasta aquí ya tenemos definida la seguridad del proyecto en torno a la creación y asignación de privilegios, podemos asignar permisos dependiendo de las labores del usuario creado si solo puede consultar información, hacer seguimientos a tareas, permisos sobre la ejecución de estas entre otras.


Mas Adelante veremos como asociar proyectos a Jenkins y poder realizar análisis a nuestras tareas........



¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Adicionar Proyectos en Jenkins

$
0
0
En esta entrada veremos como crear Tareas, el componente principal de nuestro trabajo con Jenkins..................... las tareas son el equivalente a los proyectos que queremos analizar en la herramienta, a continuación veremos como crearlas, realizar una configuración base y posteriormente dejarlas listas para su ejecución.



Requisitos.

Para el desarrollo de este tutorial (aparte de tener instalado y configurado Jenkins) se debe contar con un proyecto Java con alguna herramienta de despliegue (en este caso usaremos Ant) y previamente alojado en un repositorio.

Si no dispone de un proyecto a vincular con el aplicativo, puede consultar las siguientes entradas donde se especifica dicho proceso de creación de un proyecto web y subir código a un repositorio, o como en este caso, trabajar con un proyecto Web JBoss Seam.

Adicionar proyectos en Jenkins (tareas)

Para crear tareas en Jenkins debemos ingresar como administrador (o con un usuario que tenga permisos para creación de tareas), si es la primera vez que iniciamos Jenkins nos indicará que creemos una nueva tarea para empezar, podemos hacer click en el link proporcionado (solo se realizaría la primera vez) o damos click en nueva tarea, siendo esta última la forma normal al realizar.



Posteriormente, se cargará una pantalla en la que definiremos el nombre y tipo de proyecto a crear, para este caso crearemos una tarea para ejecutar el proyecto JBoss Seam paises.

Inicialmente podemos seleccionar la opción “Crear un proyecto estilo libre” teniendo en cuenta que es la primera tarea que tenemos, luego podremos usar las otras opciones dependiendo de nuestras necesidades, o copiar la configuración de un proyecto ya existente.




Presionamos "Ok" y se cargará una nueva pantalla en la que debemos realizar la configuración deseada, aquí es donde le indicaremos a Jenkins que descargue el proyecto desde el repositorio donde se encuentra almacenado y que ejecute la tarea Ant que permite el despliegue del mismo.

Por defecto aparece el nombre de la tarea, podemos ingresar una descripción y definir una serie de opciones como se muestra en la imagen.





  • Habilitar seguridad en el proyecto: Al seleccionar esta opción podemos configurar los usuarios a los que les vamos a asignar permisos sobre la tarea, por ejemplo si un usuario es agregado y se activa solo el check “Read”, este usuario solo podrá visualizar la tarea, pero no podrá efectuar ninguna otra acción (para estos casos también se debe tener en cuenta los permisos otorgados al usuario al momento de su creación, pues si es un administrador podrá efectuar cualquier acción).
  • Configurar el origen del código fuente: en esta sección definiremos cual es el sistema de control de versiones con el que vamos a trabajar y la ruta del repositorio donde se encuentra el proyecto, además dejamos la opción por defecto “Use ‘svn update’ as a much as possible” para que la tarea siempre realice una actualización de los archivos modificados en el repositorio y no un checkout completo.
Continuando con la configuración podemos añadir nuevas opciones a parametrizar.



En la sección “Ejecutar” definimos añadir un nuevo paso y seleccionamos “Ejecutar Ant” esto nos habilitará un nuevo panel de configuración donde estableceremos que tarea o tareas deseamos ejecutar, para este caso parametrizamos la tarea “deploy” la cual nos desplegará el proyecto Seam.



Hay que tener presente en que directorio se encuentra nuestra tarea Ant, para este ejemplo el archivo xml se encuentra en la raíz del proyecto, sin embargo en ocasiones este archivo se encuentra en otras carpetas, para esto usamos las opciones avanzadas para definir el directorio desde donde ejecutaremos la tarea deploy.......................... para este ejemplo no es necesario hacerlo.

También es importante mencionar que en la sección “Disparadores de ejecuciones” podemos usar la opción “Ejecutar periódicamente” la cual nos permitirá lanzar la tarea de forma automática dependiendo de la configuración o tiempo establecido (Cada determinado día, hora o minuto), para este ejemplo no es necesario definirlo, pues ejecutaremos la tarea de forma manual.

Por ultimo damos guardar a la configuración y podremos ver como la tarea fue creada exitosamente, nos carga una página en la que observamos información general de la tarea y un menú principal con las acciones que podemos realizar.




Si vamos a la página principal de Jenkins también podemos observar la tarea creada e información sobre la misma (estado, nombre, casos de éxito, duración, fallo), veremos bajo la columna “s” un icono Gris, pues la tarea no ha sido ejecutada aún y al final un icono desde el cual podemos ejecutarla, si se desea se puede realizar esta acción desde allí o ingresando a la tarea y presionando la opción “Construir ahora”.



y hasta aquí ya vinculamos y configuramos nuestra primer tarea a Jenkins, en la próxima entrada veremos como ejecutarla y evidenciaremos el proceso de despliegue de los proyectos en el directorio Jenkins, además veremos un poco sobre los diferentes estados que maneja la herramienta dependiendo de las ejecuciones de las tareas......


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

Ejecutar Tareas En Jenkins

$
0
0
En la entrada anterior vimos como crear una tarea en Jenkins, en esta ocasión veremos como ejecutarla para iniciar el proceso de Analisis desde el Aplicativo.

Ejecutar Tareas.
 
Después de haber creado y configurado la tarea satisfactoriamente podemos iniciar su ejecución, para esto como se mencionó anteriormente presionamos el icono de “Construir ahora” desde la página de inicio en la tarea correspondiente o ingresando a la misma y desde el menú principal.


Acto seguido en la sección “Historia de tareas” se cargará una barra de progreso indicando que la tarea se encuentra en ejecución, si es la primera vez que se realiza este proceso puede tomar un buen tiempo dependiendo del tamaño del proyecto, ya que Jenkins está realizando checkout y almacenándolo en el directorio raíz definido al momento de su instalación.

Para verificar el progreso de la ejecución podemos situar el mouse donde se muestra la fecha de ejecución y se carga un panel donde seleccionamos “Salida de consola” o simplemente dando click en la barra de progreso.

 

Al hacer esto se cargará una página donde veremos el progreso de la ejecución.


En ese momento Jenkins se conecta con el repositorio parametrizado en la tarea al momento de su configuración y empieza el proceso de checkout o descarga de código del repositorio a la máquina. 
Al finalizar se espera el mensaje BUILD SUCCESSFUL indicando que todo fue correcto.



Si regresamos a la página de inicio podemos evidenciar que la información de la tarea ha cambiado, ahora el icono bajo la columna “s” es de color azul (ya que la ejecución fue exitosa, en caso contrario sería de color rojo) y se encuentra un “Sol” bajo la columna “w”.
 

Estos iconos o imagenes en las columnas S y W indican el estado de la tarea dependiendo de las últimas 5 ejecuciones así:

      Sol : No hay ejecuciones recientes con fallos. 
      Sol con Nubes : 1 de las 5 últimas ejecuciones fallaron.
      Nubes : 1 de las 2 últimas ejecuciones fallaron. 
      Lluvia : 3 de las 5 últimas ejecuciones fallaron. 
      Tormenta :  4 de las 5 últimas ejecuciones fallaron.


      y Listo!!! ya con nuestra tarea creada podremos ejecutarla cuantas veces sea necesario o configurarla nuevamente, para que la ejecución se haga automática entre otras.

      Tambien cada vez que ingresemos a la tarea se podrá observar el histórico de ejecuciones con la respectiva fecha, estado, número de ejecución y hora.




      Si revizamos el directorio definido en la variable de entorno JENKINS_HOME podremos observar la carpeta Workspaces la cual contiene todo el codigo fuente descargado del repositorio.



      Tambien podremos encontrar la carpeta Jobs la cual contiene entre otras la carpeta builds donde se almacena el historial de ejecuciones realizadas a nuestras tareas con sus respectivas salidas en consola dependiendo de la fecha de ejecución.


      Hasta aquí ya ejecutamos nuestra primer tarea Jenkins, podemos seguir realizando practicas con nuestros proyectos y revizar la carpeta raiz donde se almacenan los archivos, mas adelante veremos como agrupar estos proyectos en vistas para tener mayor organización dentro de la Herramienta...


      Agrupando Tareas en Jenkins

      $
      0
      0
      En tutoriales anteriores trabajamos con Tareas, vimos como crearlas y configurarlas para verificar el estado de las mismas, sin embargo en la vida real vamos a tener que trabajar con muchas tareas de diferentes proyectos, en esta ocasión veremos como organizar nuestra herramienta para agrupar dichas tareas por medio de Vistas que nos proporciona Jenkins.

      Crear Vistas en Jenkins.

      En caso de que manejemos varios proyectos que dependan de muchas tareas a ejecutar, en Jenkins podemos crear vistas que básicamente podemos usar para agrupar por proyectos y tener un mayor orden y control sobre las tareas asociadas.

      Desde la página de inicio en la sección de tareas creadas podemos observar la pestaña “Todo”  y un más (+) seguido de esta, solo basta con presionar en el para crear la nueva vista.


      Al hacerlo se cargará una nueva página donde definiremos un nombre y tipo de vista a generar, seleccionamos “Lista de vistas” y presionamos “Ok”.


      Posteriormente se cargara la página donde debemos configurar la vista creada, estableceremos una descripción, opcionalmente podemos seleccionar de las tareas ya creadas, cuales se agruparán en la nueva vista.


      Al finalizar volvemos a la página de inicio donde veremos nuestra vista y  tareas agrupadas.


      De esta manera tendremos mayor organizacón en la herramienta pues al ingresar a alguna de las vistas creadas solo se mostraran las tareas asociadas a ella.



      También te podría Interesar. 



      ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

      Comparando Fechas En Java

      $
      0
      0
      En esta entrada veremos uno de los procesos obligados cuando se trabaja en este campo del desarrollo de Software, sin importar el lenguaje que manejemos en algún momento tendremos que realizar operaciones con fechas.




      En esta Ocasión y gracias a la inquietud de alguien vamos a realizar un pequeño ejemplo de como comparar dos fechas, veremos una forma fácil para definir si una fecha es menor, mayor o igual a otra, para esto usaremos la clase java.util.Date

      En el siguiente ejemplo asumiremos que ingresamos una fecha a nuestra aplicación y vamos a compararla con la fecha actual del sistema, para esto almacenaremos la fecha ingresada con un formato "dd/mm/yyyy" , luego obtendremos la fecha del sistema y la convertiremos a este formato para poder realizar las comparaciones.

      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;


      /**
      * @author HENAO
      *
      */
      public class Principal {

      /**
      * @param args
      */
      public static void main(String[] args) {

      /**Objeto de la clase */
      Principal objetoPrincipal=new Principal();

      String fecha1 = "12/05/2013";
      String fecha2 = "13/05/2013";
      String fecha3 = "14/05/2013";

      /**Obtenemos la fecha del sistema y la convertirmos al String
      * con el formato en el que vamos a trabajar*/
      Date fechaActual = new Date();
      SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
      String fechaSistema=formateador.format(fechaActual);

      /**Realizamos los llamados a los metodos de ejemplo*/

      System.out.println("\n********************************" +
      "****************************\n");

      String resultadoMenor=objetoPrincipal.compararFechasConDate(fecha1,fechaSistema);
      System.out.println(resultadoMenor+"\n");

      System.out.println("******************************" +
      "******************************\n");


      String resultadoIgual=objetoPrincipal.compararFechasConDate(fecha2,fechaSistema);
      System.out.println(resultadoIgual+"\n");

      System.out.println("******************************" +
      "******************************\n");

      String resultadoMayor=objetoPrincipal.compararFechasConDate(fecha3,fechaSistema);
      System.out.println(resultadoMayor+"\n");

      System.out.println("*****************************" +
      "*******************************\n");
      }

      /**
      * Comparamos las Fechas
      * @author CHENAO
      * @param fecha1
      * @param fechaActual
      * @return
      */
      private String compararFechasConDate(String fecha1, String fechaActual) {
      System.out.println("Parametro String Fecha 1 = "+fecha1+"\n" +
      "Parametro String fechaActual = "+fechaActual+"\n");
      String resultado="";
      try {
      /**Obtenemos las fechas enviadas en el formato a comparar*/
      SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
      Date fechaDate1 = formateador.parse(fecha1);
      Date fechaDate2 = formateador.parse(fechaActual);

      System.out.println("Parametro Date Fecha 1 = "+fechaDate1+"\n" +
      "Parametro Date fechaActual = "+fechaDate2+"\n");

      if ( fechaDate1.before(fechaDate2) ){
      resultado= "La Fecha 1 es menor ";
      }else{
      if ( fechaDate2.before(fechaDate1) ){
      resultado= "La Fecha 1 es Mayor ";
      }else{
      resultado= "Las Fechas Son iguales ";
      }
      }
      } catch (ParseException e) {
      System.out.println("Se Produjo un Error!!! "+e.getMessage());
      }
      return resultado;
      }
      }


      Y listo, Si verificamos el proceso Obtenemos los siguientes resultados.


      Podemos evidenciar que la comparación se realizó con las 3 fechas y gracias al método before sabemos cual es menor, mayor o si son iguales....


      También te podría Interesar. 


      ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

      ¿ String Vrs StringBuffer Vrs StringBuilder ?

      $
      0
      0
      Esta entrada hace parte de algunas enfocadas a repasos o conceptos de Java, en esta ocasión trabajaremos con las Clases String, StringBuffer y StringBuilder las cuales permiten el trabajo con cadenas de caracteres, a continuación veremos algunos ejemplos básicos con estas Clases y sus métodos principales y mas adelante las compararemos a nivel de rendimiento....


      La Clase String.
       
      Es común que se confundan los String con tipos de datos primitivos como un int o un double pero eso es incorrecto ya que cuando decimos que trabajamos con una variable String en realidad estamos trabajando con un Objeto y al momento de declararlo lo que hacemos es crear instancias del mismo.

      Algo que debemos tener claro es que esta clase esta enfocada a trabajar con cadenas de caracteres constantes entonces cuando definimos un objeto String este será inmutable, es decir que dicho objeto no puede cambiar, si modificamos nuestro String inicial, en realidad lo que hacemos es crear un nuevo objeto de tipo String......
       
      Para crear Objetos de la clase String se puede realizar de 2 formas, mediante su constructor o a partir de cadenas constantes o literales:
       
      Ej: 

      String cadena1 = "CoDejaVu";  o
      String cadena2 = new String("CoDejaVu");

      cualquiera de las 2 formas anteriores es valida, sin embargo la primera es mas efectiva en cuestiones de rendimiento (aunque esto con un solo objeto no es tan relevante) ya que en la segunda se hace un doble llamado al constructor de la Clase, mientras que en la primera se hace implícito y directo....


      Algunos Métodos de la Clase String

      charAt(int) : Permite retornar un caracter del String dependiendo del índice enviado como parámetro.
      indexOf(String) : Permite retornar el índice desde donde inicia la cadena enviada como parametro.
      length() : Retorna el tamaño basado en la cantidad de caracteres que posee la cadena.
      replace(Char,Char) : Busca en la cadena inicial donde se encuentre el carácter o cadena enviada en el segundo parámetro y la reemplaza por el primero.
      toUpperCase() : Convierte toda la cadena en mayúsculas.
      toLowerCase() : Convierte toda la cadena en minúsculas.
      trim() : Elimina los espacios en blanco al inicio y final de la cadena.
      concat(String) : Concatena el String enviado como parámetro a la cadena original (este metodo tiene su equivalente al usar el operador +)
      substring(int) : Elimina la cadena desde la posición 0 hasta la enviada por parámetro -1
      substring(int,int) :
      Elimina la cadena desde la posición del primer parámetro hasta la posición del segundo.
      equalsIgnoreCase(String) : Indica si dos cadenas son iguales, sin tener en cuenta las mayúsculas.

      Existen muchos mas métodos de la clase String, sin embargo estos son algunos a mi parecer mas importantes (Necesitaríamos muchas mas entradas para hablar solo del String :S ), ahora veamos como funcionan, para esto creamos el siguiente método...

      private void metodosString() {
      String cadena1=" Esto Es Un String ";

      /**Imprime la cadena original*/
      System.out.println("Cadena Original = "+cadena1);
      /**retorna la letra s (cuenta tomando el primer caracter como 0 )*/
      System.out.println("Usando charAt(2) = "+cadena1.charAt(2));
      /**retorna la posicion 9 (cuenta tomando el primer caracter como 0 )*/
      System.out.println("Usando indexOf(\"Un\") = "+cadena1.indexOf("Un"));
      /**retorna el tamaño 19 */
      System.out.println("Usando length() = "+cadena1.length());
      /**reemplaza la cadena "un" por la cadena "xxx"*/
      System.out.println("Usando replace(\"Un\", \"xxx\") = "+cadena1.replace("Un", "xxx"));
      /**convierte la cadena en mayusculas*/
      System.out.println("Usando toUpperCase() = "+cadena1.toUpperCase());
      /**convierte en minusculas*/
      System.out.println("Usando toLowerCase() = "+cadena1.toLowerCase());
      /**Elimina los espacios en blanco al principio y final de la cadena*/
      System.out.println("Usando trim() = "+cadena1.trim());
      /**Concatena al String el valor enviado*/
      System.out.println("Usando concat(\" En CoDejaVu\") = "+cadena1.concat("En CoDejaVu"));
      /**elimina la cadena de la posicion 0 a la 5*/
      System.out.println("Usando substring(6) = "+cadena1.substring(6));
      /**elimina la cadena de la posicion 4 a la 14*/
      System.out.println("Usando substring(4, 14) = "+cadena1.substring(4, 14));
      /**indica si dos cadenas son iguales, enviamos la misma cadena, retorna true*/
      System.out.println("Usando equalsIgnoreCase(cadenaOriginal) = "+cadena1.equalsIgnoreCase(cadena1));
      /**indica si dos cadenas son iguales, enviamos otra cadena, retorna false*/
      System.out.println("Usando equalsIgnoreCase(otroString) = "+cadena1.equalsIgnoreCase("Otro String"));
      }

      Al ejecutar el metodoString() obtenemos los siguientes resultados.


      Podemos ver las funciones de los métodos mencionados, sin embargo hay que tener en cuenta que en el ejemplo anterior trabajamos siempre con el Objeto String inicial, ya que en ningún momento le asignamos ningún valor ni creamos otro explicitamente, si imprimimos la cadena original nos arroja " Esto Es Un String ".....


      Las Clases StringBuffer y StringBuilder.

      En estas clases a diferencia de la Clase String las cadenas si se pueden modificar trabajando desde el objeto original, recordemos que si hacemos un cambio en un objeto String en realidad estamos trabajando con un nuevo Objeto (es decir si tenemos cadena=cadena+"hola"; en realidad lo que hacemos es crear un nuevo objeto String apuntando a la misma referencia del Objeto Cadena...)mientras que con StringBuffer o StringBuilder siempre trabajamos desde el mismo Objeto aprovechando el mismo espacio de memoria.

      La forma de crear un Objeto de alguna de estas clases es la siguiente.

      StringBuffer cadena1=new StringBuffer("CoDejaVu"); y
      StringBuilder cadena2=new StringBuilder("CoDejaVu");


      Cuando vamos a utilizar muchas cadenas podemos usar estas clases ya que al trabajar con el mismo objeto original hacen mas optimo el proceso, StringBuffer y StringBuilder son prácticamente iguales (posen la misma API), la diferencia es que StringBuilder no es Multihilo, es decir, sus metodos no se encuentran sincronizados haciéndola un poco mas veloz que su equivalente StringBuffer por eso se recomienda que al trabajar con hilos se use esta ultima en vez de StringBuilder....


       Algunos Métodos de StringBuffer y StringBuilder.

      appened(String) : Concatena la cadena enviada como parámetro, este método es sobrecargado, quiere decir que acepta cualquier tipo de dato.
      delete(int_inicial, int_final) : Elimina la cadena desde la posición inicial hasta la final.
      insert(int, String) : Inserta la cadena enviada en la posición definida, este método es sobrecargado, quiere decir que acepta cualquier tipo de dato.
      replace(int_inicial, int_final, String) : Reemplaza la cadena enviada en las posiciones de la inicial a la final.
      reverse(): imprime la cadena al revés.

      Igual que en el ejemplo de la clase String existen muchos mas métodos  pero estos son solo algunos, se recomienda consultar en la API de java sobre estos.......veamos un pequeño ejemplo del funcionamiento.................como lo mencionamos anteriormente dichas clases comparten la misma API por lo cual usan los mismos métodos, por eso solo mostraremos el ejemplo usando StringBuilder....

      private void metodosStringBuilder() {
      StringBuilder cadena1=new StringBuilder(" Esto Es Un StringBuilder ");
      /**Imprime la cadena original*/
      System.out.println("Cadena Original = "+cadena1);
      /**concatena la cadena enviada como parametro*/
      System.out.println("Usando append(\"En CoDejaVu\") = "+cadena1.append("En CoDejaVu"));
      /**Elimina la cadena desde la posicion inicial hasta la final*/
      System.out.println("Usando delete(32, 37) = "+cadena1.delete(32, 37));
      /**Inserta la cadena enviada desde la posicion inicial*/
      System.out.println("Usando insert(32, String) = "+cadena1.insert(32, "ejaVu Otra Vez"));
      /**Reemplaza la cadena enviada en las posiciones definidas*/
      System.out.println("Usando replace(2, 4, String) = "+cadena1.replace(2, 4, "xxx"));
      /**Imprime la cadena en reversa*/
      System.out.println("Usando reverse() = "+cadena1.reverse());
      }

      Al ejecutar el método anterior obtenemos el siguiente resultado:


      a diferencia del ejemplo usando String, aquí todas las operaciones se asignan al objeto inicial, evidenciando que este cada vez va cambiando dependiendo de los métodos que utilicemos.

       
      String Vrs StringBuffer Vrs StringBuilder

      Con lo anterior podemos decir que las 3 clases sirven para lo mismo, es mas, la Clase String permite un manejo mucho mas simple teniendo en cuenta que podemos omitir crear la instancia de un Objeto simplemente con un " = " que hace ese proceso implícito, o que con el "+" podemos evitar el uso del concat() o con el "+=" podemos realizar la operación y asignarla directamente al objeto String tal como se hace con algunos tipos de datos primitivos entre otras facilidades que nos brinda................ y a decir verdad casi todos nos acostumbramos a usar String por estas y otras razones, sin embargo a nivel de rendimiento son mucho mas efectivas las otras clases que estamos evaluando, ya que como dijimos los String son inmutables por ende dependiendo de lo que realicemos cada vez crearíamos objetos de este tipo y dependiendo también de la cantidad de cadenas que usemos esto seria una carga en tiempo de ejecución, pues se tendría una gran cantidad de objetos en memoria....

      A diferencia de este, StringBuffer y StringBuilder siempre trabajarán con el mismo objeto inicial y de esta manera la carga en el heap sera mucho menor.

      Como experiencia personal, alguna vez un compañero y yo desarrollamos una aplicación en la cual se Debián realizar muchas operaciones con cadenas las cuales se concatenaban y mostraban en consola, inicialmente usamos obtejos String pero a medida que crecían los datos este proceso tomaba demasiado tiempo hasta que decidimos usar objetos StringBuffer y de esta manera el tiempo se redujo significativamente.

      A continuación veremos un ejemplo muy común donde podremos simular lo anterior, en este ejemplo se solicita el ingreso de un texto y se calcula la velocidad de concatenación para cada uno de los 3 casos, el calculo se realiza en ciclos (for) cada uno con una constante de 100000 iteraciones, se evidencia la diferencia de tiempos respectivamente.

      /**
      * @author HENAO
      *
      */
      public class Cadenas {

      /**
      * constante que determina el numero de repeticiones
      * en cada uno de los tres metodos de concatenacion
      */
      public final long ITERA = 100000;
      /**determina el tiempo total de concatenacion*/
      private long tiempo;

      /**
      * @param args
      */
      public static void main(String[] args) {

      Cadenas objetoCadenas=new Cadenas();
      String valorCadena="CoDejaVu";
      String usoString=objetoCadenas.calculaTiempoString(valorCadena);
      String usoStringBuffer=objetoCadenas.calculaTiempoStringBuffer(valorCadena);
      String usoStringBuilder=objetoCadenas.calculaTiempoStringBuilder(valorCadena);

      System.out.println("Tiempo Concatenacion String : "+usoString+
      "\nTiempo Concatenacion StringBuffer : "+usoStringBuffer+
      "\nTiempo Concatenacion StringBuilder : "+usoStringBuilder);
      }


      /**
      * Metodo que calcula el tiempo de concatenacion de la cadena
      * usando la clase String
      * @param valor dato ingresado por el usuario
      * @return tiempo en milisegundos
      */
      public String calculaTiempoString(String valor)
      {
      String cadena = "";
      tiempo = System.currentTimeMillis();
      for (int i = 0; i < ITERA ; i++) {
      cadena += valor;
      }
      tiempo = System.currentTimeMillis() - tiempo;
      return tiempo + " milisegundos";
      }

      /**
      * Metodo que calcula el tiempo de concatenacion de la cadena
      * usando la clase StringBuffer
      * @param valor dato ingresado por el usuario
      * @return tiempo en milisegundos
      */
      public String calculaTiempoStringBuffer(String valor)
      {
      StringBuffer cadena = new StringBuffer();
      long tiempo = System.currentTimeMillis();
      for (int i = 0; i < ITERA ; i++) {
      cadena.append(valor);
      }
      tiempo = System.currentTimeMillis() - tiempo;
      return tiempo + " milisegundos";
      }
      /**
      * Metodo que calcula el tiempo de concatenacion de la cadena
      * usando la clase StringBuilder
      * @param valor dato ingresado por el usuario
      * @return tiempo en milisegundos
      */
      public String calculaTiempoStringBuilder(String valor)
      {
      StringBuilder cadena = new StringBuilder();
      tiempo = System.currentTimeMillis();
      for (int i = 0; i < ITERA ; i++) {
      cadena.append(valor);
      }
      tiempo = System.currentTimeMillis() - tiempo;
      return tiempo + " milisegundos";
      }
      }

      De esta manera obtenemos el siguiente resultado:


      y podemos ver la gran diferencia entre los diferentes tipos de objetos, dependiendo de la cantidad de cadenas con las que vamos a trabajar estos resultados varían y en ocasiones el tiempo de concatenación del StringBuffer es igual al del StringBuilder pues como ya mencionamos comparten la misma API, pero siempre se presentará una gran distancia con respecto al String.

      Conclusión.

      Como conclusión, vimos las diferentes formas que tenemos al momento de trabajar con datos de tipo cadena, se recomienda usar objetos String cuando no tengamos que manipular gran cantidad de cadenas y que estas no vayan a cambiar, usaremos StringBuffer cuando necesitemos trabajar con cadenas cambiantes además de que también trabajemos con varios hilos y StringBuilder cuando no trabajamos con hilos o solo se tiene uno en ejecución.


      También te podría Interesar. 


      ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

      Conceptos Básicos de Programación Orientada a Objetos

      $
      0
      0
      En esta entrada veremos algunos conceptos de la programación orientada a Objetos (POO)...............................................
      Muchas veces cuando empezamos a trabajar con lenguajes de programación nos dicen que son orientados a Objetos y nos dan la teoría del "porqué" pero puede que al trabajar con ellos en la practica no sepamos interpretarlo desconociendo el "como", y entonces seguimos desarrollando por simple inercia porque así fue que aprendimos pero tal vez no de la forma mas óptima.

      Vamos a ver algunos conceptos de POO de forma general, mas adelante trabajaremos estos conceptos en casos prácticos para ver su aplicación...... Empecemos!!!

      Programación OO.

      La programación orientada a Objetos básicamente define una serie de conceptos y técnicas de programación para representar acciones o cosas de la vida real basada en objetos, a diferencia de otras formas de programación como por ejemplo la estructurada, con la POO trabajamos de manera distinta vinculando diferentes conceptos tales como clases, objetos, métodos, propiedades, estados, herencia, encapsulación entre otros, generando cada vez interrelaciones en nuestro desarrollo en pro del funcionamiento del sistema principal, definiendo el programa como un conjunto de estos objetos relacionados entre si.

      Veamos algunos de los conceptos principales.....

      Clases. 

      Las clases son uno de los principales componentes de un lenguaje de programación, pues en ellas ocurren todos los procesos lógicos requeridos para un sistema, en si podemos definirlas como estructuras que representan objetos del mundo real, tomando como objetos a personas, lugares o cosas, en general las clases poseen propiedades, comportamientos y relaciones con otras clases del sistema.

      una clase se compone por tres partes fundamentales:

      Nombre : Contiene el Nombre de la Clase.
      Atributos : Representan las propiedades que caracterizan la clase.
      Métodos : Representan el comportamiento u operaciones, la forma como interactúa la clase con su entorno.

      En java se representa así :

      /**Principal define el nombre de la Clase*/
      public class Principal {

      public String atributo="Esto es un atributo";

      /**Esto es un método, donde se definen las operaciones*/
      public void metodo(){
      /**aqui van las sentencias que definen
      * el comportamiento del método*/
      }
      }

      Objeto.
       
      Los objetos representan una entidad concreta o abstracta del mundo real, en programación básicamente se le conoce como la instancia de una clase en si es lo que da el sentido a estas.

      Al igual que las clases se componen de tres partes fundamentales:

      Estado: Representa los atributos o características con valores concretos del objeto.
      Comportamiento : Se define por los métodos u operaciones que se pueden realizar con el.
      Identidad : Es la propiedad única que representa al objeto y lo diferencia del resto.

      en la imagen, los moldes representan las clases, mientras que las galletas obtenidas de estos moldes representan los objetos instancias de estas clases, por ejemplo atributos del objeto galleta podría ser sabor, color, tamaño etc......

      En java se representa creando una instancia de la clase por medio de la palabra new  al hacer eso creamos el objeto de la clase y podemos hacer uso de los métodos o atributos de esta (dependiendo de la visibilidad de los mismos ) por medio de un punto (.) así:

      /**Creamos el objeto como instancia de la clase Principal*/
      Principal miObjeto= new Principal();
      miObjeto.atributo="Este es el nuevo valor del atributo para el objeto";
      miObjeto.metodo();

      Herencia.
       
      La herencia en java representa lo que conocemos de herencia en el mundo real, básicamente mediante esta obtenemos las características o rasgos comunes de nuestros padres o abuelos, en java es el mismo enfoque permitiendo la creación de nuevas clases basadas en clases ya existentes, con las cuales podemos obtener las características de las clases padres, heredando campos, atributos, métodos o funcionalidades.


      En Java solo se puede heredar de una sola clase padre y se representa mediante la palabra extends

      public class Animal{
      public String tamaño;

      public void comer(){
      /**Comportamiento.....*/
      }
      }

      class Perro extends Animal{

      public int dientes;

      public void correr(){
      /**Comportamiento.....*/
      }
      }

      class Paloma extends Animal{

      public int plumas;

      public void volar(){
      /**Comportamiento.....*/
      }
      }

      Encapsulamiento.
       
      Este concepto es uno de los mas importantes en términos de seguridad dentro de nuestra aplicación, la encapsulación es la forma de proteger nuestros datos dentro del sistema, estableciendo básicamente los permisos o niveles de visibilidad o acceso de nuestros datos


      Se representa por 3 niveles :

      Público: Se puede acceder a todos los atributos o métodos de la clase.
      Protegido: Se puede acceder a los atributos o métodos solo en la misma jerarquía de herencia.
      Privado: Solo se puede acceder a los atributos o métodos de la clase en la que se encuentran.


      con la Encapsulación mantenemos nuestros datos seguros, ya que podemos evitar que por ejemplo se hagan modificaciones al estado o comportamiento de un objeto desde una clase externa, una buena practica es trabajar con métodos setter y getter que permiten manipular nuestros datos de forma segura.

      en Java lo representamos así:

      public class Principal{

      public String atributo1;
      private String atributo2;
      protected String atributo3;

      /**Métodos Set y Get para trabajar con las variables*/

      public String getAtributo2() {
      return atributo2;
      }

      public void setAtributo2(String atributo2) {
      this.atributo2 = atributo2;
      }

      }

      Clases Abstractas.
       
      La abstracción permite resaltar la parte mas representativa de algo, ignorando detalles para centrarse en lo principal.
       

      La imagen es muy fácil de identificar, con base a ella podemos crear una clase persona, o la
      clase hombre, humano entre otras, pero obviamente vemos que la imagen no tiene elementos como ojos, nariz, boca, rostro en general, ni dedos, pies, manos o cuello....... pero entonces porque decimos que es una persona?.........Precisamente aquí estamos aplicando el concepto de abstracción, ya que nos fijamos en lo mas representativo de algo, en este caso vemos que se tiene una cabeza, tronco, brazos y pies, con esto es suficiente para saber que es una persona sin fijarnos en los detalles mencionados anteriormente.
      Las clases abstractas permiten crear métodos generales con un comportamiento común para otras clases concretas sin importar sus características ni el comportamiento que usen para dichos métodos.

      La Abstracción en java solo tiene lógica mediante la Herencia, ya que una clase abstracta posee al menos un método abstracto el cual no tiene implementación, el comportamiento de estos métodos lo definen las clases concretas que lo hereden.

      Podemos usarlos cuando existan varias clases con características o acciones comunes pero con diferentes comportamientos..............mediante el uso de la herencia y componentes abstractos hacemos mas óptima y organizada nuestra aplicación. (hay que tener en cuenta que a diferencia de las clases concretas, las clases abstractas no se pueden instanciar).


      En Java representamos la abstracción mediante la palabra reservada abstract, así:


      public abstract class Principal{

      /**Método Abstracto sin implementación*/
      public abstract void metodoAbstracto();

      }

      class subClase extends Principal{

      @Override
      public void metodoAbstracto() {
      /**Implementación definida por la clase concreta*/
      }

      }

      Interfaces.

      Las interfaces son el mecanismo que utiliza Java para simular la herencia múltiple, como mencionamos en Java solo se puede extender de una sola clase, mediante el uso de interfaces esto se puede simular ya que el lenguaje permite implementar el numero de interfaces que necesitemos, básicamente son clases completamente abstractas, es común relacionarlas con un contrato en el que se define que se debe hacer, así cada clase concreta que implemente una interfaz esta obligada a implementar todos los métodos que la compongan.

      las interfaces definen lo que la clase que la implemente deberá hacer, mas no la forma como lo hará.

      al decir que las interfaces son clases completamente abstractas significa que todos sus métodos lo son y por ende no poseen implementación, no requieren el uso de la palabra reservada abstract, ya que al ser completamente abstracta todo dentro de ella lo es, al igual que las clases abstractas la implementación de los métodos depende de las clases concretas que las usen.


      Se debe tener en cuenta que toda variable definida en una interfaz automáticamente se convierte en una constante, además tampoco se puede instanciar una interfaz.....


      En java se representan con la palabra interface y se usan con la palabra implements  así: 

      interface InterfacePrincipal {

      public void metodoAbstracto();

      public String otroMetodoAbstracto();

      }

      public class Principal implements InterfacePrincipal{

      public void metodoAbstracto() {
      /**Implementación definida por la clase concreta*/
      }

      public String otroMetodoAbstracto() {
      /**Implementación definida por la clase concreta*/
      return "retorno";
      }
      }


      Polimorfismo.

      Este tal vez sea uno de los conceptos de la programación orientada a objetos mas usados pero muchas veces sin saber que se aplica ya que el concepto inicialmente puede ser un poco confuso, básicamente mediante el polimorfismo programamos de forma general en lugar de hacerlo de forma especifica, se usa cuando se trabajen con la herencia y objetos de características comunes los cuales comparten la misma superClase y árbol jerárquico, al trabajar con este concepto optimizamos y simplificamos en gran medida nuestro trabajo.

      básicamente podemos definirlo como la capacidad que tienen los objetos de comportarse de múltiples formas sin olvidar que para esto se requiere de la herencia, en si consiste en hacer referencia a objetos de una clase que puedan tomar comportamientos de objetos descendientes de esta.

       

      con el polimorfismo usamos la generalización olvidando los detalles concretos de los objetos para centrarnos en un punto en común mediante una clase padre.

      Tomando como ejemplo la imagen anterior, podemos decir que un objeto de la clase FiguraGeometrica puede usarse para referirse a cualquier objeto de cualquier subClase se FiguraGeometrica.............. en otras palabras una figura geométrica puede ser un cuadro, un triángulo, un cuadrado o cualquier figura que en términos generales sea geométrica......


      Veamos este proceso como se representa en Java.


      class FiguraGeometrica{

      }

      class Cuadrado extends FiguraGeometrica {

      }

      class Triangulo extends FiguraGeometrica {

      }

      class Circulo extends FiguraGeometrica{

      }

      public class Principal{

      public void metodo(){
      /**Puedo crear objetos concretos*/
      FiguraGeometrica miFiguraGeometrica = new FiguraGeometrica();
      Cuadrado miCuadro=new Cuadrado();

      /**Puedo crear objetos polimorficos*/
      miFiguraGeometrica=miCuadro;

      /**Objeto Cuadrado de tipo FiguraGeometrica*/
      FiguraGeometrica miCuadrado= new Cuadrado();
      /**Objeto Circulo de tipo FiguraGeometrica*/
      FiguraGeometrica miCirculo=new Circulo();
      /**Objeto Triangulo de tipo FiguraGeometrica*/
      FiguraGeometrica miTriangulo=new Triangulo();
      }
      }

      Como vemos en el ejemplo la clase FiguraGeometrica puede convertirse en cualquier figura que se encuentra en su jerarquía de Herencia pudiendo utilizar las propiedades que compartan entre ellas, hay que tener presente que solo se permite el polimorfismo de clases padre a clases hija mas no al contrario, mas adelante explicaremos este concepto en detalle...


      Hasta aquí vimos algunos de los principales conceptos de la programación Orientada a Objetos, en futuras entradas trabajaremos otros ejemplos y aplicaciones, ya que cada concepto posee sus restricciones con respecto al proceso de desarrollo.




      También te podría Interesar. 


      ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

      Herencia en Java

      $
      0
      0
      En esta ocasión vamos a profundizar un poco (desde el enfoque de programación, no teórico) en uno de los principales conceptos de programación orientada a objetos en java...............el concepto de Herencia, vamos a realizar un ejemplo practico para verificar su funcionamiento y aplicación en el desarrollo de software. 

      Como se mencionó en la entrada anterior, básicamente mediante este concepto podemos obtener las características de una clase padre o de una jerarquía mayor dependiendo de nuestro árbol de herencia, en java definimos esta jerarquía mediante la palabra extends seguido del nombre de la clase a la que vamos a heredar, también se debe tener claro que solo se puede heredar de una sola clase pues el lenguaje no permite la Herencia múltiple (En Java por defecto todas las clases heredan de la clase Object, es decir, esta es la clase Padre de todas las clases en Java).

      Requisitos.

      Lo único que necesitamos para hacer el ejemplo practico es un entorno de desarrollo, conocer los conceptos de POO (vistos en la entrada anterior) y ganas de continuar :P para este caso usaremos el IDE Eclipse...........Empecemos.


      El Ejemplo. 

      Conociendo el concepto de clases y objetos vamos a asumir que necesitamos construir una aplicación sobre los diferentes tipos de vehículos existentes, pero para esto necesitamos clasificarlos, en este caso trabajaremos con vehículos acuáticos y aéreos.

      Teniendo como punto de partida la información anterior podemos empezar a definir nuestras clases, vamos a trabajar con vehículos acuáticos y vehículos aéreos, entonces......... cual es el factor común de estos 2 tipos?..............................................

      El factor común es que sin importar si es un avión o un barco, estamos hablando de vehículos, y ambos pueden compartir características comunes por esta razón la Clase principal de nuestro sistema sera la clase Vehiculo.

      Partiendo de lo anterior podemos profundizar aun mas en nuestro árbol de herencia, sabemos que un barco o un avión son vehículos, pero será que esta información es suficiente???.......... sería correcto decir que ¿un barco es igual a un avión porque ambos son vehículos?..........definitivamente NO, ya que si bien descienden del mismo concepto de vehículo ambos tienen características propias que los diferencian, aquí es donde tenemos que pensar de forma general para poder definir un correcto árbol de herencia, por eso podemos decir que un barco además de descender de un vehículo, también desciende del tipo de vehículos Acuáticos los cuales tienen un conjunto de características comunes para cualquier vehículo acuático (sin olvidar que cada vehículo acuático puede tener sus características propias) y de la misma forma un avión desciende del tipo de vehículos Aéreos (con la misma lógica del anterior)............tenemos así nuestras clases Acuatico y Aereo que a su vez descienden de la clase Vehiculo, y son padres de cualquier vehículo en su jerarquía.

      Al final tenemos definida nuestra estructura de clases (para este ejemplo no entraremos en detalles sobre las características a profundidad de cada clase, pero si alguna básica para resaltar el concepto) así:


      Como vemos, la Clase Padre es Vehiculo, la cual tiene como hijas a las clases Acuatico y Aereo, estas a su vez son clases Padre de Barco, Velero, Avion y Helicoptero que a la vez son nietas de Vehiculo...Simple o ¿no?

      Con esto ya tenemos una jerarquía de herencia definida, esto quiere decir que por ejemplo la clase Avion puede usar el método volar() de la clase Aereo, así como también usar el método transportar() de la clase Vehiculo, pues se encuentra en el mismo árbol de herencia, sin embargo no puede usar el método navegar() de la clase Acuatico, ya que no es de tipo Acuatico.

      Teniendo nuestro diagrama definido, vamos a aplicar el concepto en Java.

      Vehiculo.
      Clase Padre.
      /**
      * @author HENAO
      *
      */
      public class Vehiculo {

      public int modeloVehiculo;

      public String nombreVehiculo="";

      public String transportar(){
      return "Metodo transportar de clase Vehiculo";
      }
      }


      Acuatico.
      SubClase extiende de Vehiculo.
      public class Acuatico extends Vehiculo{

      public String nombreAcuatico="";

      public String navegar(){
      return "Método navegar de clase Acuatico";
      }

      }

      Aereo.
      SubClase extiende de Vehiculo.
      public class Aereo extends Vehiculo {

      public String nombreAereo="";

      public String volar(){
      return "Método volar desde clase Aereo";
      }
      }

      Barco.
      SubClase extiende de Acuatico.
      public class Barco extends Acuatico {

      public String prenderMotor(){
      return "Método prenderMotor en clase Barco";
      }
      }

      Velero.
      SubClase extiende de Acuatico.
      public class Velero extends Barco{

      public String izarVelas(){
      return "Método izarVelas en clase Velero";
      }
      }

      Clase Avion. 
      SubClase extiende de Aereo.
      public class Avion extends Aereo{

      public String bajarTrenDeAterrizaje(){
      return "Método bajarTrenDeAterrizaje en clase Avion";
      }
      }

      Clase Helicoptero.
      SubClase extiende de Aereo.
      public class Helicoptero extends Aereo{

      public String encenderHelices(){
      return "Método encenderHelices en clase Helicoptero";
      }
      }

      Como vemos seguido del nombre de la clase se tiene la palabra extends la cual indica que se extiende o hereda de la clase definida, así mismo todas las clases tienen al menos un método que representa la característica propia de la clase, para las clases hijas ese método define el proceso que solo ellas pueden realizar, para las clases padre, ese método define el proceso que es común o general para las clases hijas.

      Ahora veremos como funciona la herencia en nuestra aplicación.

      Creamos una clase Principal donde se realizarán las operaciones, podemos crear instancias de las clases y verificar el nivel de acceso que tenemos a las características tanto de nuestra clase como de nuestra Jerarquía de Herencia, así.


      En la imagen vemos que tenemos una instancia de la clase Vehículo, esto lo podemos traducir como la creación del objeto miVehiculo de tipo Vehiculo, no olvidemos que esta clase es la clase padre, por eso al verificar los métodos disponibles (En Eclipse después del punto hacemos Ctrl+espacio) vemos que nos aparecen las características propias de la clase, asi como otros métodos de la clase Object (Recordemos que en java todas las clases heredan de Object) que también podemos usar.
       

      Al crear otro objeto de la clase Acuatico y realizar el mismo proceso anterior, vemos que ahora tenemos no solo los métodos propios de la clase sino también los métodos y atributos de la clase Vehiculo.

      Ahora miremos un objeto de las clases Hijas.
       

      Al crear un objeto de la clase Barco vemos que ahora no solo tenemos las características de Barco sino también podemos hacer uso de las características de Acuatico y de Vehiculo.

      Este mismo principio aplica para la otra parte de nuestra jerarquía (Vehículos Aéreos) donde como mencionamos anteriormente solo podemos acceder a los métodos y atributos disponibles para ese árbol de herencia.

      Veamos todo nuestro código...
      public class Principal {

      /**
      * @param args
      */
      public static void main(String[] args) {

      System.out.println("*********************************************************************");
      System.out.println("* << CoDejaVu >> *");
      System.out.println("* *");
      System.out.println("*********************************************************************");
      System.out.println();
      System.out.println("-------------------<< Clase Padre Vehiculo >>-----------------------");
      Vehiculo miVehiculo = new Vehiculo();
      miVehiculo.nombreVehiculo="El Gran Transportador";
      System.out.println("usando miVehiculo, nombreVehiculo : "+miVehiculo.nombreVehiculo);
      System.out.println("usando miVehiculo llama a: "+miVehiculo.transportar());
      System.out.println("--------------------------------------------------------------------");
      System.out.println();

      System.out.println("----------<< SubClase hija Acuatico Extiende de Vehiculo >>---------");
      Acuatico miAcuatico= new Acuatico();
      miAcuatico.nombreVehiculo="El Navegante";
      System.out.println("usando miAcuatico, nombreVehiculo : "+miAcuatico.nombreVehiculo);
      System.out.println("usando miAcuatico llama a : "+miAcuatico.transportar());
      System.out.println("usando miAcuatico llama a : "+miAcuatico.navegar());
      System.out.println("---------------------------------------------------------------------");
      System.out.println();

      System.out.println("-----<< SubClases hijas extienden de la Subclase Padre Acuatico>-----");
      Barco miBarco=new Barco();
      miBarco.nombreVehiculo="Titanic";
      System.out.println("usando miBarco, nombreVehiculo : "+miBarco.nombreVehiculo);
      System.out.println("usando miBarco llama a : "+miBarco.transportar());
      System.out.println("usando miBarco llama a : "+miBarco.navegar());
      System.out.println("usando miBarco llama a : "+miBarco.prenderMotor());
      System.out.println();

      Velero miVelero=new Velero();
      miVelero.nombreVehiculo="Tormenta";
      System.out.println("usando miVelero, nombreVehiculo : "+miVelero.nombreVehiculo);
      System.out.println("usando miVelero llama a : "+miVelero.transportar());
      System.out.println("usando miVelero llama a : "+miVelero.navegar());
      System.out.println("usando miVelero llama a : "+miVelero.izarVelas());
      System.out.println("---------------------------------------------------------------------");

      System.out.println("----------<< SubClase hija Aereo Extiende de Vehiculo >>---------");
      Aereo miAereo= new Aereo();
      miAereo.nombreVehiculo="El Volador";
      System.out.println("usando miAereo, nombreVehiculo : "+miAereo.nombreVehiculo);
      System.out.println("usando miAereo llama a : "+miAereo.transportar());
      System.out.println("usando miAereo llama a : "+miAereo.volar());
      System.out.println("---------------------------------------------------------------------");
      System.out.println();

      System.out.println("-----<< SubClases hijas extienden de la Subclase Padre Aereo >-----");
      Avion miAvion=new Avion();
      miAvion.nombreVehiculo="El Condor";
      System.out.println("usando miAvion, nombreVehiculo : "+miAvion.nombreVehiculo);
      System.out.println("usando miAvion llama a : "+miAvion.transportar());
      System.out.println("usando miAvion llama a : "+miAvion.volar());
      System.out.println("usando miAvion llama a : "+miAvion.bajarTrenDeAterrizaje());
      System.out.println();

      Helicoptero miHelicoptero=new Helicoptero();
      miHelicoptero.nombreVehiculo="El lobo del Aire";
      System.out.println("usando miHelicoptero, nombreVehiculo : "+miHelicoptero.nombreVehiculo);
      System.out.println("usando miHelicoptero llama a : "+miHelicoptero.transportar());
      System.out.println("usando miHelicoptero llama a : "+miHelicoptero.volar());
      System.out.println("usando miHelicoptero llama a : "+miHelicoptero.encenderHelices());
      System.out.println("---------------------------------------------------------------------");
      System.out.println();

      System.out.println("--<< Propiedad de la clase Vehiculo usada por todas las clases Hijas >--");
      System.out.println("nombre Vehiculo :"+miVehiculo.nombreVehiculo);
      System.out.println("nombre Acuatico :"+miAcuatico.nombreVehiculo);
      System.out.println("nombre Aereo :"+miAereo.nombreVehiculo);
      System.out.println("nombre Barco :"+miBarco.nombreVehiculo);
      System.out.println("nombre Velero :"+miVelero.nombreVehiculo);
      System.out.println("nombre Avion :"+miAvion.nombreVehiculo);
      System.out.println("nombre Helicoptero :"+miHelicoptero.nombreVehiculo);
      System.out.println("---------------------------------------------------------------------");

      }
      }

      Con este ejemplo hacemos el llamado a los métodos tanto propios como heredados de las clases padres, obteniendo el siguiente resultado.
       

      Como vemos podemos acceder a los diferentes métodos desde otras clases, y si nos fijamos bien podemos identificar que siempre usamos la misma propiedad nombreVehiculo de la clase Vehiculo, lo hicimos usando objetos diferentes por tal razón el valor de la propiedad depende del asignado por cada objeto, convirtiéndose en un atributo del objeto y no de la clase como tal.


      Conclusión

      Podemos ver que la herencia va ligada a muchos otros conceptos, vimos el concepto de clase, el concepto de objetos entre otros, en este caso también es importante conocer el concepto de encapsulación ya que como compartimos características entre clases tenemos que estar seguros que la clase que accede puede usarlas, aunque mas adelante trataremos este tema a profundidad.........espero que esta entrada sea útil y fácil de entender...... 



      También te podría Interesar. 


      ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

      Clases en Java

      $
      0
      0
      En Entradas anteriores vimos conceptos de programación orientada a objetos así como un ejemplo de la herencia en Java, Para continuar con esta secuencia de entregas sobre el tema vamos a hablar un poco mas sobre el concepto de clases...

      En el tutorial anterior trabajamos con diferentes clases para verificar el concepto de Herencia donde solo usamos clases concretas.....pero que son?

      Clases.

      Vamos a tomar la definición publicada en la entrada sobre Conceptos Básicos de Java, donde dijimos que podemos definirlas como estructuras que representan objetos del mundo real, tomando como objetos a personas, lugares o cosas, las cuales se componen por tres partes fundamentales:

      Nombre : Contiene el Nombre de la Clase.
      Atributos : Representan las propiedades que caracterizan la clase.
      Métodos : Representan el comportamiento u operaciones, la forma como interactúa la clase con su entorno.  


      Hay que tener en cuenta que Java posee unos estándares de codificación,  que definen las convenciones para nombres de clases, métodos, variables, constantes........

      para las clases se define lo siguiente:

      -La primera letra debe ser mayúscula.
      -Utilizar nomenclatura camelCase (por ej: un nombre compuesto por varias palabras : clase "FiguraGeometrica")
      -Los nombres deben ser sustantivos.

      Con base a lo anterior, y como la idea es representar algo de la vida real, entonces podemos decir que una clase puede ser cualquier cosa, solo basta con mirar a nuestro alrededor y observar cualquier objeto, casi todas las cosas son candidatas para convertirse en clases, por ejemplo una silla, un carro, un avión, una mesa, un perro, una persona entre otros.............basados en este concepto veamos un ejemplo de clase donde aplicaremos las tres partes fundamentales:

      Si queremos trabajar con un carro definimos:

      Nombre de la clase: Carro
      Atributos de la clase : Color, marca, tipo, tamaño, numero de puertas....
      Métodos de la clase: encender(), arrancar(), girar(), retroceder(), frenar() .....

      hay que tener en cuenta que la clase carro es la representación general de todos los carros, por eso los atributos se manejan como variables, ya que si tomamos la marca o el color, depende del carro con el que vamos a trabajar.

      Y listo, ya tenemos el concepto de nuestra clase definida, en la entrada sobre conceptos basicos vimos la estructura básica de una clase en java, ahora veamos como se representa nuestra clase Carro:
      /**Principal define el nombre de la Clase*/
      public class Carro{

      public String color="Rojo";
      public String marca="Mazda";
      public String tipo="Camion";
      public String tamaño="Grande";
      public String puertas="4";

      /**Esto es un método, donde se definen las operaciones*/
      public void arrancar(){
      /**aqui van las sentencias que definen
      * el comportamiento del método*/
      }

      public void girar(){
      /**aqui van las sentencias que definen
      * el comportamiento del método*/
      }

      public void retroceder(){
      /**aqui van las sentencias que definen
      * el comportamiento del método*/
      }

      public void frenar(){
      /**aqui van las sentencias que definen
      * el comportamiento del método*/
      }
      }

      Como vemos la clase cumple con las reglas definidas anteriormente, tiene un nombre, atributos y métodos, solo tenemos que definir lo que queremos que nuestros métodos realicen...................y listo!!! 

      Eso fue todo sobre el concepto básico de clase, una próxima entrada veremos la definición de clases Abstractas y su correcta aplicación.

      Clases Abstractas

      $
      0
      0
      En la entrada sobre conceptos básicos hablamos un poco sobre el termino de Abstracción y en general del como se aplica en el campo de la programación.

      En esta ocasión vamos a trabajar un poco mas en detalle sobre este concepto de forma rápida y sencilla, veremos la importancia del mismo y su aplicación.

      Como se ha mencionado, la abstracción permite resaltar lo mas representativo de algo sin importar los detalles.

      Básicamente una clase Abstracta es similar a una clase normal (como la vimos en la entrada anterior), la estructura es practicamente igual, ya que poseen nombre, atributos y métodos pero para que una clase sea abstracta la condición es que almenos uno de sus métodos sea abstracto (se le agrega la palabra reservada abstract y no se especifica el cuerpo del método).................su uso depende de la aplicación del concepto de Herencia y adicionaremos a la estructura básica de clase la palabra reservada abstract

      Veamos como se implementa en Java.

      public abstract class Principal{

      /**Método concreto con implementación*/
      public void metodoConcreto(){
      ...............
      ...............
      }

      /**Método Abstracto sin implementación*/
      public abstract void metodoAbstracto();

      }

      class subClase extends Principal{

      @Override
      public void metodoAbstracto() {
      /**Implementación definida por la clase concreta*/
      }

      }


      Caracteristicas de una Clase Abstracta.

      Esto es lo que debemos conocer sobre de Clases Abstractas.
      • Una clase Abstracta No puede ser instanciada (no se pueden crear objetos directamente - new ), solo puede ser heredada. 
      • Si almenos un método de la clase es abstract, esto obliga a que la clase completa sea definida abstract, sin embargo la clase puede tener el resto de métodos no abstractos.
      • Los métodos abstract no llevan cuerpo (no llevan los caracteres {}). 
      • La primer subclase concreta que herede de una clase abstract debe implementar todos los métodos de la superclase.

      ¿Cuando Utilizarlas?.

      Al trabajar clases y métodos abstractos, no solo mantenemos nuestra aplicación mas organizada y fácil de entender sino que también al no poder instanciar una clase abstracta nos aseguramos de que las propiedades especificas de esta, solo estén disponibles para sus clases hijas....

      Con las Clases Abstractas lo que hacemos es definir un proceso general que luego sera implementado por las clases concretas que hereden dichas funcionalidades..........¿Que?........... es decir, si tengo una clase que hereda de otra Abstracta, estoy obligado a poner en el código, todos los métodos abstractos de la clase padre, pero esta vez serán métodos concretos y su funcionalidad o cuerpo sera definido dependiendo de para que la necesite, de esa manera si tengo otra clase que también hereda del mismo padre, implementaré el mismo método pero con un comportamiento distinto..........Veamos un Ejemplo.



      En el diagrama vemos una clase Abstracta Instrumento, la cual posee una propiedad tipo y un método abstracto tocar(), vemos también las clases hijas Guitarra, Saxofon y Violin que para este ejemplo solo utilizaremos (mediante la herencia) las propiedades de la clase Padre.

      Todos los instrumentos musicales se pueden tocar, por ello creamos este método abstracto, ya que es un proceso común en todos los instrumentos sin importar el detalle de como se tocan, pues sabemos que una guitarra no se toca de la misma manera que el saxofon, así al heredar de la clase Instrumento, todas sus clases hijas están obligadas a implementar este método y darle la funcionalidad que le corresponda...

      veamos esto en Java.
      /**
      * Clase Abstracta Instrumento
      */
      abstract class Instrumento{

      public String tipo;

      public abstract void tocar();
      }

      /**
      * Clase Concreta Guitarra, hija de Instrumento
      */
      class Guitarra extends Instrumento {

      public Guitarra(){
      tipo="Guitarra";
      }

      public void tocar() {
      System.out.println("Tocar La Guitarra");
      }
      }

      /**
      * Clase Concreta Violin, hija de Instrumento
      */
      class Violin extends Instrumento {

      public Violin(){
      tipo="Violin";
      }

      public void tocar() {
      System.out.println("Tocar El violin");
      }
      }

      /**
      * Clase Concreta Saxofon, hija de Instrumento
      */
      class Saxofon extends Instrumento {

      public Saxofon(){
      tipo="Saxofon";
      }

      public void tocar() {
      System.out.println("Tocar el Saxofon");
      }
      }

      public class Principal {

      public static void main(String arg[]){
      /**Objeto miGuitarra de tipo Instrumento */
      Instrumento miGuitarra= new Guitarra();
      System.out.println("Instrumento : "+miGuitarra.tipo);
      miGuitarra.tocar();
      System.out.println();
      /**Objeto miSaxofon de tipo Instrumento */
      Instrumento miSaxofon= new Saxofon();
      System.out.println("Instrumento : "+miSaxofon.tipo);
      miSaxofon.tocar();
      System.out.println();
      /**Objeto miViolin de tipo Instrumento */
      Instrumento miViolin= new Violin();
      System.out.println("Instrumento : "+miViolin.tipo);
      miViolin.tocar();

      }

      }
      Como vemos cada una de las clases concretas implementan el método tocar() y le dan la funcionalidad dependiendo de como se toque el instrumento, también en cada constructor de las clases definimos el tipo, pero si nos fijamos bien en las clases concretas no tenemos la variable tipo declarada, pues estamos usando la variable heredada de la clase Instrumento.


      Hay que tener en cuenta que cuando trabajamos con clases Abstractas, estas solo pueden ser heredadas mas no instanciadas, esto quiere decir que no podemos crear objetos directamente de estas clases.

      Como vemos en la clase Principal tenemos la lógica para ejecutar nuestra aplicación y usamos el concepto de Polimorfismo para crear los objetos de tipo Instrumento por medio de sus clases Hijas, pero en ningún momento creamos un objeto como instancia directa de la clase abstracta......

      Y listo, ya aplicamos de manera simple el concepto de Abstracción, en la próxima entrada veremos que son las Interfaces y mas adelante veremos como funciona el Polimorfismo mediante otro ejemplo de programación........


      Referencias.

      Revista JavaWorld

      SCJP Sun Certified Programmer for Java 6


      También te podría Interesar. 


      ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

      Interfaces en Java

      $
      0
      0
      Como sabemos en Java no existe la herencia múltiple, pudiendo heredar solamente de una clase, las Interfaces son una gran herramienta para simular este concepto......

      En esta entrada describiremos un poco sobre lo que son las interfaces, sus principales características y veremos un diagrama que nos puede colaborar para su mejor entendimiento...

      Para empezar debemos saber que una Interface es una Clase completamente Abstracta, como regla, sabemos que las clases abstractas poseen como mínimo un método abstracto, pero hablando de una interface, todos sus métodos tienen que serlo...

      Como vimos en la entrada sobre conceptos básicos, las interfaces muchas veces son definidas como un tipo de contrato entre las clases concretas que la implementen, ya que la clase que lo haga se encuentra obligada a definir los métodos abstractos que la componen. 

      Lo anterior quiere decir que cuando creamos un Interface, lo que hacemos es definir lo que la clase que la implemente podrá hacer, pero no indicamos la forma en que lo hará.

      Podemos decir que las interfaces simulan la herencia múltiple ya que una clase puede implementar cualquier numero de interfaces, además las interfaces pueden heredar uno o mas números de interfaces mediante la palabra extends, pero jamas podrán heredar clases concretas...

      En java se usa la palabra reservada implements para indicar que implementamos una interface, la estructura general de una clase que implementa una interface es la siguiente.

      interface InterfacePrincipal {

      public void metodoAbstracto();

      public String otroMetodoAbstracto();

      }

      public class Principal implements InterfacePrincipal,otraInterface,otraMas{

      public void metodoAbstracto() {
      /**Implementación definida por la clase concreta*/
      }

      public String otroMetodoAbstracto() {
      /**Implementación definida por la clase concreta*/
      return "retorno";
      }

      public void metodoAbstractoDeOtraInterface() {
      /**Implementación definida por la clase concreta*/
      }

      public void metodoAbstractoDeOtraMas() {
      /**Implementación definida por la clase concreta*/
      }
      }
      Vemos que la clase Principal implementa 3 interfaces, por eso decimos que simulan la herencia múltiple ya que heredamos los métodos que nos brindan..............veamos en general las principales características.

      Características de las Interfaces.

      • Todos los métodos de una interfaz son implícitamente public abstract, no es necesario especificarlo en la declaración del mismo.
      • Todas las variables y atributos de una interfaz son implícitamente constantes (public static final), no es necesario especificarlo en la declaración del misma
      • Los métodos de una interfaz no pueden ser: static, final, strictfp ni native.
      • Una interfaz puede heredar (extends) de una o más interfaces.
      • Una interfaz no puede heredar de otro elemento que no sea una interfaz.
      • Una interfaz no puede implementar (implements) otra interfaz.
      • Una interfaz debe ser declarada con la palabra clave interface.
      • Los tipos de las interfaces pueden ser utilizados polimórficamente.
      • Una interfaz puede ser public o package (valor por defecto). 
      • Los métodos toman como ámbito el que contiene la interfaz.
       Algunas de las anteriores características se verían así.

      /**Las interfaces Heredan de cualquier cantidad de interfaces usando extends*/
      public interface PrimerInterface extends SegundaInterface, TercerInterface
      {

      /**Las siguientes son declaraciones validas para los atributos*/
      int ATRIBUTO1= 5;
      public int ATRIBUTO2= 5;
      public static int ATRIBUTO3= 5;
      public final int ATRIBUTO4= 5;
      static int ATRIBUTO5= 5;
      final int ATRIBUTO6= 5;
      static final int ATRIBUTO7= 5;
      public static final int ATRIBUTO8= 5;

      /**Las siguientes son declaraciones validas para los métodos*/
      void metodoPrimerInterface1();
      public void metodoPrimerInterface2();
      abstract void metodoPrimerInterface3();
      public abstract void metodoPrimerInterface4();
      }

      Como vemos las anteriores son algunos ejemplos de la forma de declarar atributos o métodos, cualquiera de las opciones anteriores es valida....

      Hay que tener presente algo, ya vimos que tanto para clases Abstractas como para Interfaces la herencia es permitida, pero por ejemplo para este tipo componentes, si una interface hereda de otra, esta no está obligada a implementar los métodos que posee la Interface padre, ya que la implementación tanto de los métodos de la clase padre como de la interface que los hereda depende de la clase concreta que implemente dicha interface........ este principio también aplica a las clases Abstractas, si unaclase abstracta implementa una interface, los métodos de esta no necesariamente se deben implementar en la clase Abstracta, pero si se tienen que implementar en la clase concreta que herede de la clase abstracta....
       

      ¿Cuando Utilizarlas?

      Su uso esta muy ligado al concepto de herencia y cumple el mismo principio que aplicamos al usar clases abstractas, lo que buscamos es establecer un mecanismo donde podamos compartir características comunes entre clases diferentes, además al igual que con clases abstractas nos aseguramos que los métodos y atributos solo están disponibles para las clases que las implementen...

      Veamos un Ejemplo.


      En el diagrama de clases vemos 6 clases concretas y 2 interfaces, las clases Humano y Animal son clases padre de "Hombre y Mujer" y "Perro y Gato" respectivamente, ahora bien, Humano y Animal son clases diferentes con un árbol de herencia marcado, pero ambas poseen características comunes que podemos usar por medio de la interface AccionesGeneral.

      Podemos decir que tanto un Hombre como un Gato pueden caminar, usando para esto el método desplazarse(), donde cada clase dará el mecanismo de desplazamiento, por ejemplo el hombre lo hace en 2 piernas mientras que el gato en 4 patas (o dependiendo de la forma como lo realicen), y este mismo concepto puede aplicarse a los otros métodos enmarcados en la Interface AccionGeneral que tanto Humanos como Animales comparten.

      También tenemos la interface AccionesHumano para esos métodos o características que solo son aplicables a los humanos y que tanto Hombre como Mujer pueden adoptar, así la clase Humano podrá simular la herencia múltiple al implementar las 2 interfaces mencionadas.

      Y listo!!! Básicamente esta es la logica detras de las Interfaces, Los invito a desarrollar este ejemplo en Java aplicando la estructura de interface explicada anteriormente y similar al ejemplo tratado en la entrada sobre Clases Abstractas....

      En la próxima entrada trataremos el concepto de Polimorfismo el cual esta muy ligado a todo lo visto hasta el momento.....


      Referencias.

      Revista JavaWorld
      SCJP Sun Certified Programmer for Java 6



      También te podría Interesar. 


      ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

      Polimorfismo en Java

      $
      0
      0
      Al escuchar la palabra polimorfismo lo primero que se nos viene a la mente es "Muchas Formas" y bueno, si, básicamente esta es la idea general, pero y que mas gira en torno a esto???........

      en esta entrada veremos algunos ejemplos y puntos a tener en cuenta sobre el polimorfismo en la programación orientada a objetos y para eso aplicaremos otros conceptos trabajados con anterioridad..... y mas adelante desarrollaremos un ejemplo en Java donde pondremos a prueba lo aprendido en esta entrada......


      Algunas Ideas.

      Como se mencionó en la entrada sobre Conceptos Básicos, podemos definirlo como la capacidad que tienen los objetos de comportarse de múltiples formas, programando de manera general en vez de hacerlo de forma especifica...

      Alguna vez consultando, definían este concepto como la forma en la que podemos tratar una subClase como si fuera una Clase del tipo de su superClase, usando solo los métodos o atributos disponibles para la Clase declarada..... es decir, si tenemos una clase "X" podemos decir que "X" es de tipo "Y" esto se cumple solo si existe una relación de herencia entre ellas, ya sea si "X" hereda de "Y" (extends) o si "X" implementa a "Y" (implements)

      Retomando (de manera reducida) el ejemplo de la entrada sobre conceptos básicos en el punto sobre polimorfismo, se explica mejor lo anterior usando "X" como cualquier clase Cuadrado, Triangulo o Circulo y "Y" como la clase FiguraGeometrica, por lo tanto decimos que por ejemplo la clase Triangulo es de tipo FiguraGeometrica, en Java esto lo representamos asi:

      class FiguraGeometrica{

      }

      class Triangulo extends FiguraGeometrica {

      }

      public class Principal{

      public void metodo(){
      /**Puedo crear objetos polimorficos*/
      /**Objeto Triangulo de tipo FiguraGeometrica*/
      FiguraGeometrica triangulo=new Triangulo();
      }
      }

      Vemos que FiguraGeometrica es la superClase y Triangulo es la clase hija o subClase, y por medio del polimorfismo podemos crear una instancia de Triangulo de tipo FiguraGeometrica...

      Algunas Consideraciones. 

      (Estas consideraciones fueron tomadas de la revista digital JavaWord pues me parecen muy claras a la hora de trabajar con polimorfismo.)

      Como en todo, tenemos unas reglas que se deben cumplir y tener en cuenta cuando vamos a trabajar con objetos polimorficos, estas son :
      • Una variable de referencia puede ser de un solo tipo, y una vez que fue declarada, ese tipo jamás puede modificarse..... por ejemplo, si declaramos triangulo de tipo FiguraGeometrica, no podemos decir mas adelante que el mismo objeto triangulo es de tipo FiguraPuntiaguda... 
      • Una referencia es una variable, de manera que puede ser reasignada a otros objetos (a menos que se declare como final). por ejemplo podemos hacer lo siguiente:
         FiguraGeometrica miFiguraGeometrica = new FiguraGeometrica();
        Cuadrado miCuadro=new Cuadrado();

        /**Puedo crear objetos polimorficos, asignando su referencia*/
        miFiguraGeometrica=miCuadro;

        • Una variable de referencia puede tomar como referencia cualquier objeto del mismo tipo, o un subtipo del mismo..... va muy ligada a la anterior, pero nos dice que si por ejemplo tenemos la clase cuadroPequeño que es subClase de cuadro, al ser "nieta" de FiguraGeometrica, si se crean instancias de ella, se pueden reasignar a instancias de FiguraGeometrica... 
          • Un tipo de variable de referencia determina los métodos que pueden ser invocados sobre el objeto que la variable referencia.... Triangulo al ser de tipo FiguraGeometrica puede acceder no solo a los métodos de la clase Triangulo sino también a los de FiguraGeometrica (Claro, pues tiene que existir una relación de Herencia entre ellos)  
          • Una variable de referencia puede tener como tipo el de una interface. Si es declarada de esta manera, podrá contener cualquier clase que implemente la interfaz..... las interfaces también permiten el uso de herencia, por lo tanto podemos crear objetos usando para esto una interfaz, por ejemplo si FiguraGeometrica fuera una interface, lo anterior seria igual..... (esto también aplica para las clases Abstractas).

            Como mencionamos en entradas pasadas, las clases abstractas y las interfaces (al ser clases completamente abstractas) no pueden ser instanciadas, o no directamente, la única forma de hacerlo es mediante la herencia, ya que así extendemos sus funcionalidades creando objetos referenciando clases pero siendo del tipo de su superClase (abstracta o interface)

            Hasta aquí la parte teórica, espero que sea de utilidad..................... y en la próxima entrada veremos un ejemplo simple de como aplicar este concepto mediante un ejemplo en Java!!!


            Referencias.

            Revista JavaWorld
            SCJP Sun Certified Programmer for Java 6



            También te podría Interesar. 


            ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

            Ejemplo de Polimorfismo En Java

            $
            0
            0
            En esta entrada vamos a trabajar un ejemplo rápido y simple aplicando el concepto de Polimorfismo, en el post anterior vimos algunas consideraciones y reglas  importantes cuando trabajamos con objetos Polimorficos, si hay dudas sobre como aplicarse, se recomienda dar una mirada al post anterior.....

            Sin mas rodeos, a lo que vinimos.....


            Para este ejemplo vamos a trabajar usando una Interface, una clase Abstracta y 2 clases Concretas como vemos en el siguiente diagrama:




            Podemos ver que se tiene un árbol de herencia definido, donde la clase Abstracta Animal implementa la interface IAnimal y al mismo tiempo es clase Padre de Gato y Perro, los cuales implementaran no solo los métodos abstractos de Animal sino también el método comunicarse() de la interface IAnimal.......en entradas anteriores vimos que una de las reglas al trabajar con clases abstractas o interfaces es que todas las clases concretas que desciendan de ellas, están obligadas a implementar sus métodos......... en este caso veremos como la clase Animal al ser abstracta no esta obligada a hacerlo, pero sus hijas si....

            Veamos como se codifica el diagrama anterior en Java:

            Interface IAnimal.
            public interface IAnimal {

            int valor=5;

            /**
            * Método Comunicarse, sera implementado por las clases concretas
            * que hereden de la clase Animal
            */
            public void comunicarse();

            }
            La Interface IAnimal posee el método comunicarse() el cual es completamente abstracto, evidenciamos que no es necesario indicarlo mediante la palabra abstract...........De la misma forma tenemos el atributo valor el cual (al ser declarado en la interface) se comporta como una Constante, así que nunca va a cambiar (en la entrada sobre Interfaces indicamos el porqué de estas propiedades)....

            Clase Abstracta Animal.
            public abstract class Animal implements IAnimal {

            private String nombre;

            /**
            * Constructor de la clase Animal
            * @param nombre
            */
            public Animal (String nombre){
            this.nombre=nombre;
            System.out.println("Constructor Animal, " +
            "nombre del animal : "+this.nombre);
            }

            /**
            * Retorna el valor de nombre
            * @return
            */
            public String getNombre(){
            return nombre;
            }


            /**
            * Metodo Abstracto tipoAnimal, la implementación depende
            * de las clases concretas que extiendan la clase Animal
            */
            public abstract void tipoAnimal();

            }


            Como vemos tenemos la clase Abstracta que implementa la Interface IAnimal pero como mencionamos al principio, esta clase no esta obligada a implementar el método comunicarse() ya que también es clase abstracta.

            Tenemos el método tipoAnimal() el cual si debe ser declarado como abstracto, evidenciamos también el atributo nombre el cual lo declaramos como private y solo accederemos a el en nuestro árbol de herencia, con el aplicamos un poquito el concepto de Encapsulación (pero no de la forma ideal, podemos ver una pequeña definición en la entrada sobre conceptos Básicos).

            Clase Gato.
            public class Gato extends Animal{

            /**
            * Constructor explicito clase Gato
            * @param nombre
            */
            public Gato(String nombre) {
            super(nombre);//envia el parametro a el constructor de la clase padre
            System.out.println("Constructor Gato, nombre : "+nombre);
            }

            public void tipoAnimal() {
            System.out.println("Tipo Animal : Es un Gato");
            }

            public void comunicarse(){
            System.out.println("Metodo comunicarse : El gato maulla... Miau Miau");
            }
            }

            Clase Perro.
            public class Perro extends Animal{

            /**
            * @param nombre
            */
            public Perro(String nombre) {
            super(nombre);
            System.out.println("Constructor perro, nombre : "+nombre);
            }

            public void tipoAnimal() {
            System.out.println("Tipo Animal : Es un Perro");
            }

            public void comunicarse(){
            System.out.println("Metodo comunicarse : El perro Ladra... Guau Guau");
            }
            }

            Como vemos las Clases Gato y Perro heredan de la clase abstracta Animal, por ende implementan el método tipoAnimal(), y como Animal implementa la interface IAnimal, entonces tanto Gato como Perro al ser clases concretas están obligadas a implementar el método comunicarse()....

            En las clases también podemos ver que se utiliza la propiedad nombre que es enviada al constructor de Animal mediante el llamado a super(nombre).

            Hasta aquí ya tenemos las clases del diagrama, ahora veamos como relacionarlas mediante una clase principal.

            Clase Test.
            public class Test {
            public static void main (String[] arg){

            /**Creamos anim, un objeto Perro de tipo Animal*/
            Animal anim= new Perro("goliath") ;
            anim.tipoAnimal();
            anim.comunicarse();
            System.out.println();

            /**Creamos perro, un objeto Perro de tipo Perro*/
            Perro perro=new Perro("hercules");
            perro.tipoAnimal();
            System.out.println();

            /**Creamos animalPolimorfico, un objeto perro de tipo Animal
            * asignamos una referencia ya existente*/
            Animal animalPolimorfico=perro;
            animalPolimorfico.tipoAnimal();
            System.out.println();

            /**reasignamos la referencia del objeto anim a el objeto perro
            * esto es valido ya que ambos son de tipo Perro*/
            perro=(Perro) anim;
            perro.tipoAnimal();
            System.out.println();

            /**Creamos gat, un objeto Gato de tipo Animal*/
            Animal gat=new Gato("pichi");
            gat.tipoAnimal();
            gat.comunicarse();
            System.out.println();

            /**Creamos cat, un objeto Gato de tipo IAnimal
            * Para esto aplicamos polimorfismo usando la Interface*/
            IAnimal cat = new Gato("pitufa");
            cat.comunicarse();

            System.out.println("\nConstante en la interfaz Animal : "+IAnimal.valor);
            }
            }

            Esta clase permite la creación de Objetos Polimorficos donde vemos que podemos usar las superClases para crear objetos de sus subClases, de esa forma podemos decir que perro es un Animal o Gato es un Animal .... Al ejecutar obtenemos.


            En este ejemplo creamos diferentes objetos uno a uno para verificar la aplicación del polimorfismo, pero esto también puede evidenciarse de otras maneras, por ejemplo podemos crear un arreglo de tipo Animal y en el almacenar objetos de su árbol de herencia.... veamos..

            Agreguemos a la clase Test el siguiente código...
            Animal animales[]= { new Perro("simon"),new Perro("paco"),new Gato("mimi")};
            for(Animal a : animales){
            a.tipoAnimal();
            }
            System.out.println();

            Como mencioné hace un momento, tenemos un arreglo animales de tipo Animal donde en cada posición almacenamos diferentes objetos subClases de Animal, así que cuando recorremos el arreglo podemos acceder a las propiedades del objeto que corresponda, así como las de su superClase...



            Si de pronto quisieramos agregar al arreglo animales un objeto de tipo Planta, esto nos arrojaría error, ya que planta no debería hacer parte de la Jerarquía definida para el arreglo con el que estamos trabajando, en otras palabras porque planta no es un Animal....


            Conclusiones....

            En los ejemplos pudimos aplicar las reglas de Polimorfismo vistas en la entrada anterior además también evidenciamos la aplicación de otros conceptos combinando algunos como la Herencia, Clases Concretas, Clases Abstractas, Interfaces.

            Podemos resaltar el método comunicarse() que heredan las clases Perro y Gato, donde al ser un método abstracto nos permite dar la implementación que queramos dependiendo de quien lo use, entonces podemos ver que tanto perro como gato se comunican pero de forma distinta y esa diferencia se ve en nuestra implementación...

            En general vimos la importancia de trabajar con un paradigma Orientado a Objetos, pues nos da facilidades tanto a nivel de optimización como a nivel de estructura y lógica de la aplicación, así como brindar claridad en los principales conceptos en torno a la POO...


            Mas adelante nos adentraremos en el mundo de los Patrones de Diseño, donde se podrán evidenciar y aplicar los conceptos vistos nuevamente....




            También te podría Interesar. 


            ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

            Manejo de Excepciones en Java

            $
            0
            0
            Vamos a hablar un poco sobre las Excepciones en Java, que son?, de donde vienen? y como evitarlas entre, otras....... debemos tener presente que siempre estamos propensos a encontrarnos con errores o Excepciones cuando estamos desarrollando, por eso de la importancia de conocerlas y saber como tratarlas....

            Básicamente una excepcion es un Objeto descendiente de la clase java.lang.Object, podemos pensar en ellas como una condición excepcional en nuestro sistema el cual altera la correcta ejecución del mismo, las excepciones nos indican que hay algo anómalo,  inconsistente o simplemente un Error, lo cual impide que el sistema se ejecute como debería de ser...

            Tal vez se preguntaran si ¿pero Anómalo, inconsistente o Error no es básicamente lo mismo?...... podría ser, pero en este enfoque no necesariamene lo es, ya que lo que vamos a conocer como una excepcion no siempre es un error (hablando como excepcion en general, ya que en java una Exception es muy diferente a un Error), muchas veces necesitaremos trabajar con excepciones controladas para indicar alguna inconsistencia en nuestro sistema que podría provocar errores.......

            A modo de ejemplo, podemos encontrarnos con el famoso NullPointerException el cual nos indica que un objeto se encuentra vació, pero esto no es un error ya que nosotros podemos trabajar con objetos null, entonces veamoslo como si la excepcion nos dijera "Es un objeto nulo y no se puede efectuar el proceso", mientras que hay errores como NoClassDefFoundError el cual nos indica que la maquina virtual de Java (JVM) no puede encontrar una clase que necesita, debido a por ejemplo que no encuentra un .class, esto si se maneja como un error en java

            Para hacer mas claridad sobre el tema veamos la Jerarquía de Excepciones de Java (puede que no se encuentren algunas excepciones, pero se contemplan las mas comunes)

            Jerarquía de excepciones



            Vemos que se tiene un claro árbol de herencia mediante el cual se pueden definir las categorías de Excepciones o de Error que se puede dar en el sistema.

            La importancia de Prever!!!

            Cuando se esta programando debemos tener claro que nuestro código no es perfecto, así tengamos mucha experiencia en desarrollo siempre esta la posibilidad de que algo falle, sea por nuestro código o por otros factores, por eso de la importancia de contemplar todo desde antes, posibles fallos o lo que pueda afectar el sistema.

            Veamos un ejemplo Simple:
            private void metodoDividir(int dividendo, int divisor){

            String resultado+=dividendo/divisor;
            System.out.println(resultado);

            }

            el metodoDividir(int, int) teóricamente esta bien, claro, a simple vista si tenemos : dividendo = 4 y divisor = 2 pues el resultado es 2 ......básico....... pero y si el divisor es 0? pues con ese caso puntual el resultado seria el siguiente.




            Vemos que nos indican que se produjo una ArithmeticException debido a una división por cero, además se muestra cual fue la traza del error pasando por el método main hasta el metodoDividir().


            La anterior es una Excepcion simple, algo que se supone no debería pasar, es obvio, no se puede dividir por cero, o ¿no?.........pues no, en programación no podemos asumir ni pensar así, ya que muchas veces nos olvidamos de las cosas obvias y las pasamos por alto, el problema es que eso tan obvio puede detener toda la ejecución del programa.


            Trabajando con try - catch - finally

            con los bloques Try - Catch podemos capturar y procesar una posible excepcion, evitando que el sistema se detenga sin necesidad cuando el motivo de esto puede ser corregido facilmente, la estructura básica es la siguiente.
            try {
            //Bloque de código que vamos a procesar
            } catch(excepcion) {
            //Tratamiento que se le da a la posible excepción
            } finally {
            //Bloque de código que se ejecutará despues del try o del catch
            }


            Apliquemos esto a nuestro ejemplo anterior...
            private void metodoDividir(int dividendo, int divisor){
            String resultado="";
            try {
            resultado+=dividendo/divisor;
            }catch (Exception e) {
            resultado="Se intentó dividir por cero";
            JOptionPane.showMessageDialog(null,"Error: No se puede dividir por cero ",
            "Advertencia",JOptionPane.WARNING_MESSAGE);
            }
            finally{
            System.out.println("Termino el proceso : el resultado es = "+resultado);
            }
            }

            Como vimos aplicamos la estructura de los bloques y de esta manera nos aseguramos que la excepción anterior fue controlada evitando que el sistema se detenga, en el catch podemos hacer el proceso que consideremos conveniente, ya sea solo informar del error o solicitar nuevos parámetros de entrada.

            la salida es la siguiente:



            Algunas Consideraciones.

            Veamos un poco mas lo que debemos tener en cuenta cuando usamos estos bloques:

            try : Aquí vamos a escribir todo el bloque de código que posiblemente llegue a lanzar unas excepción la cual queremos manejar, aquí va tanto el código como llamados a métodos que puedan arrojar la excepción.

            En este bloque solo se detectara la primera excepcion lanzada, hay que tener en cuenta que por cada try se debe especificar un catch y/o un finally.

            catch : en caso de que en el try se encuentre alguna excepción, se ingresara automaticamente al bloque catch donde se encontrara el código o proceso que queremos realizar para controlar la excepción.

            Se pueden especificar cualquier cantidad de catch de ser necesario, estos deben ser ubicados después del try y antes del finally (en caso de que este ultimo se especifique),  cada catch que se ponga debe manejar una excepcion diferente (no se puede repetir) y el orden de estos depende de la jerarquía de herencia que se tenga, ingresando al primer catch que pueda suplir la necesidad a corregir, por ejemplo.
            try {
            //Sentencias con posibles errores;
            } catch(InterruptedException e){
            //manejo de la exepcion
            } catch(IOException e){
            //manejo de la exepcion
            } catch(Exception e){
            //manejo de la exepcion
            }

            Si se genera una excepción en el try, se valida a cual de los 3 catch se ingresa, dependiendo si InterruptedException puede controlarlo se ingresa a esa, sino entonces a IOException o si no a la superClase que seria Exception (ver la jerarquía de herencia anterior).

            En el ejemplo que del metodoDividir() trabajamos directamente con Exception e, de esta forma nos aseguramos que capture cualquier excepción, sin embargo se recomienda usar la jerarquía en los catch para poderle dar un mejor manejo.

            finally : Este bloque es opcional, lo podremos si queremos ejecutar otro proceso después del try o el catch, es decir, siempre se ejecutara sin importar que se encuentre o no una excepción, a menos que exista un return en alguno de los bloques anteriores.


            Conclusiones.

            Esta entrada es un abrebocas de lo que son el manejo de excepciones, ya que un solo post no es suficiente para todo lo que tiene que ver con ellas, quedan pendiente definir aspectos como checked y unchecked (ya que aquí esto se trabajo de forma muy general) o la forma de crear nuestras propias excepciones, propagación, clausulas throws entre otras.

            En general vimos la importancia de controlar excepciones ya que eso hace parte de la seguridad y calidad de nuestros desarrollos, mas adelante se irán vinculando en otros post el uso de las mismas.........


            Referencias.

            Revista JavaWorld
            SCJP Sun Certified Programmer for Java 6


            También te podría Interesar. 


            ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

            Ejemplo Conectando Java con MySql

            $
            0
            0
            En esta entrada vamos a tocar uno de los puntos fundamentales en el desarrollo de software, no vamos a entrar en detalles de que es una BD, ni los tipos existentes ni como crearlas entre muchos otros temas en torno a esto, solamente muestro una pequeña aplicación (muy básica) donde veremos de forma fácil como conectarnos a una BD para consultar y registrar información
            ....además daremos paso a futuras entradas sobre los Patrones de Diseño, ya que en esta aplicaremos los Patrones VO (Value Object) y DAO (DataAccess Objetc).

            Requisitos.
            • Ambiente de desarrollo (En este caso Eclipse)
            • JDK instalado.
            • MySql Instalado
            • mysql-connector-java-5.0.8-bin (lo pueden bajar desde aquí)
            • Conocimientos Basicos de Programación.
            • Ganas de Continuar.

            En Marcha.

            Bueno, vamos a hacer una aplicación simple, la idea de este tutorial es ver como conectarnos a MySql desde Java, por eso no nos preocuparemos tanto en como se presentaran nuestra información, ni los tipos de datos, ni que tan óptimo sea nuestro código, simplemente vamos a crear una base desde donde podamos trabajar.

            La Aplicación.

            El siguiente diagrama muestra la estructura de nuestra aplicación (Ojo no es un diagrama de clases completo, es mas usado para dar claridad al sistema, por eso no nos enfocaremos en asociaciones, tipos de datos o etc)


            Como vemos la aplicación es básica, nos conectaremos a una BD donde tenemos una única tabla y mediante Java vamos a acceder a dicha BD para poder registrar y consultar información, la idea es poder registrar y consultar personas, en la aplicación tendremos un Menú principal con estas opciones.....

            La Base de Datos.

            Nuestra base de datos solo tendrá la tabla persona con los datos básicos de registro (si se desea se puede dar otro enfoque a la tabla o trabajar con muchas mas), el Script para la creación es el siguiente:
            CREATE DATABASE /*!32312 IF NOT EXISTS*/`codejavu` /*!40100 DEFAULT CHARACTER SET latin1 */;

            USE `codejavu`;

            /*Table structure for table `persona` */

            DROP TABLE IF EXISTS `persona`;

            CREATE TABLE `persona` (
            `id` int(10) NOT NULL,
            `nombre` varchar(30) default NULL,
            `edad` int(3) default NULL,
            `profesion` varchar(30) default NULL,
            `telefono` decimal(10,0) default NULL,
            PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

            /*Data for the table `persona` */

            Empecemos!!!

            Para iniciar vamos a crear un proyecto java en Eclipse, por cuestiones de organización crearemos las clases de nuestro diagrama separándolas por paquetes, esto con el fin de tener nuestro proyecto mas estructurado y fácil de entender, así.



            Como vemos tenemos un paquete por cada clase, en estos momentos la aplicación es pequeña por lo tanto no nos da problemas de organización, sin embargo a medida que vaya creciendo se hace importante tener nuestras clases agrupadas facilitando así el trabajo futuro y la mantenibilidad de nuestro sistema.

            Clase DbConnection.

            Esta clase será nuestra cadena de conexion, aquí definiremos los parámetros requeridos para conectarnos a la BD creada anteriormente.
            package prueba.connection;
            import java.sql.*;

            /**
            * Clase que permite conectar con la base de datos
            * @author chenao
            *
            */
            public class DbConnection {
            /**Parametros de conexion*/
            static String bd = "codejavu";
            static String login = "root";
            static String password = "";
            static String url = "jdbc:mysql://localhost/"+bd;

            Connection connection = null;

            /** Constructor de DbConnection */
            public DbConnection() {
            try{
            //obtenemos el driver de para mysql
            Class.forName("com.mysql.jdbc.Driver");
            //obtenemos la conexión
            connection = DriverManager.getConnection(url,login,password);

            if (connection!=null){
            System.out.println("Conexión a base de datos "+bd+" OK\n");
            }
            }
            catch(SQLException e){
            System.out.println(e);
            }catch(ClassNotFoundException e){
            System.out.println(e);
            }catch(Exception e){
            System.out.println(e);
            }
            }
            /**Permite retornar la conexión*/
            public Connection getConnection(){
            return connection;
            }

            public void desconectar(){
            connection = null;
            }
            }


            En la clase estamos aplicando el manejo de excepciones, tema tratado en el articulo anterior, vemos como se tiene contemplada la jerarquía de excepciones pertinente.


            Clase PersonaVO. 

            Esta clase nos permite dar un manejo mucho mas organizado y seguro a nuestra información, en ella estamos aplicando el patrón VO (Value Object) con el cual nos aseguramos que los datos viajen en un solo objeto, evitando no solo el envió de gran cantidad de parámetros sino también un mayor control............Debemos saber que por cada tabla de nuestra BD se tiene que construir su equivalente clase VO.
            package prueba.vo;


            /**
            * CLase VO con los atributos del campo empleado
            * @author chenao
            *
            */
            public class PersonaVO{

            private Integer idPersona;
            private String nombrePersona;
            private Integer edadPersona;
            private String profesionPersona;
            private Integer telefonoPersona;

            /**
            * @return the idPersona
            */
            public Integer getIdPersona() {
            return idPersona;
            }
            /**
            * @param idPersona the idPersona to set
            */
            public void setIdPersona(Integer idPersona) {
            this.idPersona = idPersona;
            }
            /**
            * @return the nombrePersona
            */
            public String getNombrePersona() {
            return nombrePersona;
            }
            /**
            * @param nombrePersona the nombrePersona to set
            */
            public void setNombrePersona(String nombrePersona) {
            this.nombrePersona = nombrePersona;
            }
            /**
            * @return the edadPersona
            */
            public Integer getEdadPersona() {
            return edadPersona;
            }
            /**
            * @param edadPersona the edadPersona to set
            */
            public void setEdadPersona(Integer edadPersona) {
            this.edadPersona = edadPersona;
            }
            /**
            * @return the profesionPersona
            */
            public String getProfesionPersona() {
            return profesionPersona;
            }
            /**
            * @param profesionPersona the profesionPersona to set
            */
            public void setProfesionPersona(String profesionPersona) {
            this.profesionPersona = profesionPersona;
            }
            /**
            * @return the telefonoPersona
            */
            public Integer getTelefonoPersona() {
            return telefonoPersona;
            }
            /**
            * @param telefonoPersona the telefonoPersona to set
            */
            public void setTelefonoPersona(Integer telefonoPersona) {
            this.telefonoPersona = telefonoPersona;
            }
            }


            Como vemos cada campo de la tabla persona es reflejado en la Clase PersonaVO, tambien aplicamos un poco el concepto de Encapsulación tratado en un articulo anterior mediante la creación de metodos setter y getter por cada dato privado.

            Clase PersonaDAO. 

            Esta clase sera la encargada de gestionar el acceso a los datos, con ella aplicamos un patrón DAO (DataAccess Objetc) no entraremos en detalle (mas adelante se presentara una entrada sobre este Patrón) ya que básicamente necesitamos saber que este patrón nos enseña la forma de obtener información de la BD mediante métodos CRUD (Create, Read, Update y Delete), así que por cada tabla de nuestra BD debemos tener una clase DAO que la represente!!!
            package prueba.dao;

            import java.sql.PreparedStatement;
            import java.sql.ResultSet;
            import java.sql.SQLException;
            import java.sql.Statement;
            import java.util.ArrayList;
            import javax.swing.JOptionPane;
            import prueba.connection.DbConnection;
            import prueba.vo.PersonaVO;


            /**
            * Clase que permite el acceso a la base de datos
            * @author chenao
            *
            */
            public class PersonaDAO
            {

            /**
            * Permite registrar un empleado
            * @param persona
            */
            public void registrarPersona(PersonaVO persona)
            {
            DbConnection conex= new DbConnection();
            try {
            Statement estatuto = conex.getConnection().createStatement();
            estatuto.executeUpdate("INSERT INTO persona VALUES ('"+persona.getIdPersona()+"', '"
            +persona.getNombrePersona()+"', '"+persona.getEdadPersona()+"', '"
            +persona.getProfesionPersona()+"', '"+persona.getTelefonoPersona()+"')");
            JOptionPane.showMessageDialog(null, "Se ha registrado Exitosamente","Información",JOptionPane.INFORMATION_MESSAGE);
            estatuto.close();
            conex.desconectar();

            } catch (SQLException e) {
            System.out.println(e.getMessage());
            JOptionPane.showMessageDialog(null, "No se Registro la persona");
            }
            }

            /**
            * permite consultar el empleado asociado al documento enviado
            * como parametro
            * @param documento
            * @return
            */
            public ArrayList< personavo> consultarPersona(int documento) {
            ArrayList< personavo> miEmpleado = new ArrayList< personavo>();
            DbConnection conex= new DbConnection();

            try {
            PreparedStatement consulta = conex.getConnection().prepareStatement("SELECT * FROM persona where id = ? ");
            consulta.setInt(1, documento);
            ResultSet res = consulta.executeQuery();

            if(res.next()){
            PersonaVO persona= new PersonaVO();
            persona.setIdPersona(Integer.parseInt(res.getString("id")));
            persona.setNombrePersona(res.getString("nombre"));
            persona.setEdadPersona(Integer.parseInt(res.getString("edad")));
            persona.setProfesionPersona(res.getString("profesion"));
            persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));
            miEmpleado.add(persona);
            }
            res.close();
            consulta.close();
            conex.desconectar();

            } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "no se pudo consultar la Persona\n"+e);
            }
            return miEmpleado;
            }

            /**
            * permite consultar la lista de empleados
            * @return
            */
            public ArrayList< personavo> listaDePersonas() {
            ArrayList< personavo> miEmpleado = new ArrayList< personavo>();
            DbConnection conex= new DbConnection();

            try {
            PreparedStatement consulta = conex.getConnection().prepareStatement("SELECT * FROM persona");
            ResultSet res = consulta.executeQuery();
            while(res.next()){
            PersonaVO persona= new PersonaVO();
            persona.setIdPersona(Integer.parseInt(res.getString("id")));
            persona.setNombrePersona(res.getString("nombre"));
            persona.setEdadPersona(Integer.parseInt(res.getString("edad")));
            persona.setProfesionPersona(res.getString("profesion"));
            persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));
            miEmpleado.add(persona);
            }
            res.close();
            consulta.close();
            conex.desconectar();

            } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "no se pudo consultar la Persona\n"+e);
            }
            return miEmpleado;
            }

            }
            Por cuestiones de tiempo no realizaremos todo el CRUD, tan solo vamos a trabajar con los métodos de registro y consulta (Los métodos de actualización y eliminación serán una buena tarea en casa ;) )

            Cada método usa la cadena de conexión creada anteriormente y se enfoca en una tarea en especifico, además en cada uno hacemos uso de un objeto de tipo PersonaVO, mediante el cual asignamos la información de nuestra tabla persona,tanto para el registro como para la consulta de información.

            Clase Principal.

            En esta clase vamos a hacer el llamado a todos los procesos de nuestra aplicación, tendremos un menú en el cual presentamos todas las opciones del sistema, así mismo se validaran las entradas del usuario para evitar posibles inconsistencias y posteriormente se hace el llamado a la clase DAO que permite ejecutar los procesos de conexión con la BD.
            package prueba.principal;

            import java.util.ArrayList;
            import javax.swing.JOptionPane;
            import prueba.dao.PersonaDAO;
            import prueba.vo.PersonaVO;


            public class Principal {

            PersonaDAO miPersonaDAO;

            /**
            * Método principal, hace el llamado al menú donde se
            * presentan todas las opciones del sistema
            * @param args
            */
            public static void main(String[] args) {

            Principal miPrincipal = new Principal();
            miPrincipal.verMenu();
            }

            /**
            * Método que permite presentar las opciones del sistema.
            * solicita el ingreso de un numero y se envia a su
            * correspondiente proceso
            */
            private void verMenu() {

            String textoMenu="Menú Principal\n\n";
            textoMenu+="Ingrese alguna de las opciones del Menú \n";
            textoMenu+="1. Registrar Persona\n";
            textoMenu+="2. Consultar Persona\n";
            textoMenu+="3. Ver Lista Personas\n";
            textoMenu+="4. Salir.\n\n";

            try {
            int seleccion= Integer.parseInt(JOptionPane.showInputDialog(textoMenu));
            defineSeleccion(seleccion);
            } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null,"Error en el ingreso de Datos, " +
            "solo se permiten valores númericos","ERROR",JOptionPane.ERROR_MESSAGE);
            verMenu();
            } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Error en el ingreso de Datos, " +
            "solo se permiten valores númericos","ERROR",JOptionPane.ERROR_MESSAGE);
            verMenu();
            }
            }

            /**
            * Permite determinar que accion ejecutar dependiendo del parametro de
            * ingreso correspondiente a las opciones del sistema
            * @param seleccion
            */
            private void defineSeleccion(int seleccion) {

            System.out.println("Selecciona "+seleccion);

            switch (seleccion) {
            case 1:
            registrarPersona();
            verMenu();
            break;
            case 2:
            int doc=Integer.parseInt(JOptionPane.showInputDialog("Ingrese el numero" +
            " de documento de la persona"));
            buscarPersona(doc);
            verMenu();
            break;
            case 3:
            obtenerRegistros();
            verMenu();
            break;
            case 4:
            System.exit(0);
            break;
            default:
            JOptionPane.showMessageDialog(null, "Ingrese un " +
            "numero valido","ADVERTENCIA",JOptionPane.WARNING_MESSAGE);
            verMenu();
            break;
            }
            }

            /**
            * Permite solicitar los datos de la persona a registrar, se solicitan mediante
            * una ventana de ingreso y se almacenan en un arreglo con toda la informacion usando
            * para esto un ciclo for, posteriormente estos datos son almacenados en el
            * atributo correspondiente del objeto persona para ser enviado al metodo de registro
            * en la clase DAO
            */
            private void registrarPersona() {
            miPersonaDAO = new PersonaDAO();
            PersonaVO miPersona=new PersonaVO();

            String mensajeIngreso="Ingrese\n\n";

            String datosSolicitados[] = {"Documento : ","Nombre : ",
            "Edad: ","Profesión: ","Telefono: "};
            String datosPersona[] = new String[5];
            for (int i = 0; i < datosSolicitados.length; i++) {
            //solicita el ingreso del dato y se almacena en el arreglo de datosPersona
            datosPersona[i]=JOptionPane.showInputDialog(null, mensajeIngreso+
            datosSolicitados[i],"Datos Persona",JOptionPane.INFORMATION_MESSAGE);

            System.out.println(datosSolicitados[i]+datosPersona[i]);
            }

            miPersona.setIdPersona(Integer.parseInt(datosPersona[0]));
            miPersona.setNombrePersona(datosPersona[1]);
            miPersona.setEdadPersona(Integer.parseInt(datosPersona[2]));
            miPersona.setProfesionPersona(datosPersona[3]);
            miPersona.setTelefonoPersona(Integer.parseInt(datosPersona[4]));

            miPersonaDAO.registrarPersona(miPersona);

            }

            /**
            * Permite obtener la lista de personas almacenada en la tabla persona
            * si la lista se encuentra vacia quiere decir que no hay personas registradas
            * acto seguido se presenta un mensaje en pantalla, sino se imprime la lista de
            * todas las personas registradas en la BD
            */
            private void obtenerRegistros() {
            miPersonaDAO = new PersonaDAO();
            PersonaVO miPersona;

            //Se obtiene la lista de personas
            ArrayList< personavo> listaPersonas = miPersonaDAO.listaDePersonas();
            //se valida si se obtubo o no informacion
            if (listaPersonas.size()>0) {
            int numeroPersona=0;
            //se recorre la lista de personas asignandose cada posicion en un objeto persona
            for (int i = 0; i < listaPersonas.size(); i++) {
            numeroPersona++;
            miPersona=listaPersonas.get(i);
            System.out.println("****************Persona "+numeroPersona+"**********************");
            System.out.println("Id Persona: "+miPersona.getIdPersona());
            System.out.println("Nombre Persona: "+miPersona.getNombrePersona());
            System.out.println("Edad Persona: "+miPersona.getEdadPersona());
            System.out.println("Profesión Persona: "+miPersona.getProfesionPersona());
            System.out.println("Telefono Persona: "+miPersona.getTelefonoPersona());
            System.out.println("*************************************************\n");
            }
            }else{
            JOptionPane.showMessageDialog(null,"Actualmente no " +
            "existen registros de personas","INFORMACIÓN",JOptionPane.INFORMATION_MESSAGE);
            }

            }

            /**
            * Permite la consulta de una persona en especifico mediante el envio de
            * su documento de identidad como parametro, en caso de que no se retorne
            * informacion se presenta un mensaje en pantalla, sino entonces se imprimen los
            * datos de la persona encontrada
            * @param documento
            */
            private void buscarPersona(int documento) {
            miPersonaDAO = new PersonaDAO();
            PersonaVO miPersona;
            ArrayList< personavo> personasEncontrada = miPersonaDAO.consultarPersona(documento);
            //se valida que se encuentre la persona
            if (personasEncontrada.size()>0) {
            //se recorre la lista y se asignan los datos al objeto para imprimir los valores
            for (int i = 0; i < personasEncontrada.size(); i++) {
            miPersona=personasEncontrada.get(i);
            System.out.println("****************Persona*************************");
            System.out.println("Id Persona: "+miPersona.getIdPersona());
            System.out.println("Nombre Persona: "+miPersona.getNombrePersona());
            System.out.println("Edad Persona: "+miPersona.getEdadPersona());
            System.out.println("Profesión Persona: "+miPersona.getProfesionPersona());
            System.out.println("Telefono Persona: "+miPersona.getTelefonoPersona());
            System.out.println("*************************************************\n");
            }
            }else{
            JOptionPane.showMessageDialog(null,"El documento ingresado " +
            "no corresponde a ninguna persona","INFORMACIÓN",JOptionPane.INFORMATION_MESSAGE);
            }
            }
            }

            Como se ve, tenemos la clase principal dividida en metodos para cada proceso, eso hace que podamos darle un tratamiento individual a cada uno, asi en caso de algun error facilmente podremos identificar en que metodo sucedio....... tambien vemos que en el método verMenu() validamos por medio de bloques try - catch los posibles errores en el ingreso de datos por parte del usuario.

            Ejecutando la Aplicación.

            Al ejecutar la aplicación se presenta el menú principal donde ingresamos las opciones correspondientes, pero hay que tener presente que previamente debimos haber agregado el mysql-connector al build path del proyecto, sino nos aparecera algo como esto :

            Para solucionarlo sobre el proyecto damos clic derecho/configure Build path... , buscamos al jar desde la ruta donde lo descargamos y damos ok


            después de esto ya tendremos nuestra aplicación en funcionamiento


            Como se mencionó al principio, es una aplicación básica y no nos enfocamos en muchos detalles.........tan solo en la logica de conexión que nos servira como base para futuros desarrollos....

            Mas adelante continuaremos con otros temas de interes donde aplicaremos los conceptos vistos en esta entrada!!!


            También te podría Interesar. 


            ¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....

            Viewing all 129 articles
            Browse latest View live