lunes, 29 de junio de 2015

SERIALIZACIÓN DE OBJETOS EN JAVA

SERIALIZACIÓN

La serialización de un objeto se utiliza para obtener una secuencia de bytes que represente el estado de un objeto, es decir el estado de sus campos. Podemos decir que serializar un objeto consiste en guardad elestado de sus campos.
Si el objeto a serializar tiene campos que a su vez son objetos, habrá que serializarlos primero, también se utiliza la serialización para poder reconstruir el objeto serializado. 

INTERFAZ SERIALIZABLE

Un objeto serializable es un objeto que se puede convertir en una secuencia de bytes. Para que un objeto pueda ser serializable, debe implementar la interfaz java.io.Serializable. Esta interfaz no implemeta ningún método, se usa para aquellas clases cuyas instancias
pueden ser convertidas a secuencias de bytes y tambieén ser reconstruídas. 


Flujos basados en bytes


Para la serialización de objetos:
„Clase ObjectOuputStream
Método - writeObject()
Ejemplo: flujoSalida.writeObjetct (objetoClase);
„ 
Para la deserialización de objetos:
Clase ObjectInputStream
Método - readObject()
Ejemplo: objetoClase = (Clase) flujoEntrada.readObject();

EJEMPLO

Consideremos el siguiente ejemplo, crearemos tres clases: Paciente, SerializarEscribir y SerializarLeer;

La clase Paciente va a implementar la interfaz Serializable:





En la clase SerializarEscribir lo que vamos a hacer es serializar un objeto de tipo ArrayList<Paciente> y lo vamos a escribir en un archivo llamado informacion.dat, creamos una objeto de la clase ObjectOuputStream ya que dentro de esta clase tenemos el método writeObject() que sirve para serializar el objeto.

Una vez que hayamos serializado el objeto y guadado, se crea el archivo informacion.dat el cual contiene el objeto listapacientes serializado


En la clase SerializarLeer lo que vamos a hacer es deserializar un objeto de tipo ArrayList<Paciente> que esta guardado en el archivo llamado informacion.dat, creamos una objeto de la clase ObjectInputStream ya que dentro de esta clase tenemos el método readObject() que sirve para deserializar el objeto, y luego lo guardamos en un nuevo ojbeto de tipo ArrayList<Paciente>.




Nuestra salida al mandar a imprimir el objeto lista pacientes es el siguiente:


Bibliografía



domingo, 21 de junio de 2015

EXCEPCIONES EN JAVA

Introducción

Dentro de la programación hay algo que casi siempre va a ocurrir y son los errores en los programas, el lenguaje de programación Java utiliza excepciones para permitir trabajar de una mejor manera con los errores. Los errores que se pueden clasificar de la siguente manera:

Errores de sintaxis: Ocurren en tiempo de diseño o codificación. 
Errores logicos: Ocurren cuando la logica en que se ha realizado un programa no es la deseada.
Errores del sistema: Estos pueden ser fatales y no fatales, estos ultimos son concidos como las excepciones y pueden sererrores como: división para cero, conversión de tipos, etc.

Los primeros lenguajes se empezaron a ver las necesidades de un sistema de tratamiento de errores asi es como se aparecen las excepciones, los lenguajes fueron evolucionando hasta tener sistemas gestores de excepciones con amplias posibilidades, La incorporación de sistemas de tratamiento de errores permitió dar un gran paso en la mejora de la respuesta de los programas ante excepciones que se había comprobado que eran inevitables. 

Concepto de excepción: Una excepción es un evento que ocurre durante la ejecución del programa que interrumpe el flujo normal de las sentencias

Uso de excepciones en Java

Cuando se produce un error en algún método, se lanza un objeto de tipo Throwable, cualquier método que llame a este,   puede capturar la excepción y tratarlo de la forma mas oportuna. Después de capturar la excepción, la ejecución del programa continua en el punto donde se haya capturado la excepción, y no vuelve al método en el que se produjo la excepción.   

Jerarquía de clases para el manejo de excepciones en Java



Throwable: Es la clase raiz que se encuentra en el paquete java.lang y representa aquellos que se puede lanzar en Java. contiene una instantanea del estado de la pila en el momento en el que se creó el objeto, tambien almacena un mensaje que detalla qué error se produjo, además de una causa que permite representar el error que causó este error.

Error: Es una subclase de Throwable, y nos indica problemas graves que una aplicación no debería intentar solucionar.

Exception: Sus subclases nos indican situaciones que una apliccación debería de tratar de forma razonable. las principales excepciones son:

  • RuntimeException: Son errores del programador (división para cero, acceso fuera de los límites de un array).
  • IOException: Son errores que no puede evitar el programador(relacionados con la E/S del programa).

¿Cómo crear sus propias excepciones?

Hay dos formas de tratar errores en Java: capturarlos o lanzarlos. Para el tratamiento de excepciones, Java necesita de un conjunto de palabras nuevas para tener en cuenta que cualquier código puede fallar o ser mal interpretado en tiempo de ejecución,  estas son try, catch y finally que corresponden a la captura de errores.

Bloques try - catch

Se utilizan para capturar las excepciones que se hayan podido producir en el bloque de código delimitado por try y catch, cuando se produce la excepción el bloque try termina su ejecucuón. 
La clausula catch recibe como argumento un objeto de tipo Throwable y estos pueden ser: Exception, dentro de este, ArithmeticException, NullPointerException,etc.



En la representación de un código empleando estos bloques si no hay ninguna excepción se ejecutarán los bloques: 1,2,5 en ese orden. 
Si existe una excepción de tipo aritmético se esecutarán los bloques 1,2*,3,5, y la excepción ocurrirá en bloque 2. 
Si se da otro tipo de excepción se ejecutarán los bloques 1,2*,4,5.  

Finally

Para que se ejecute un freagmento de código independientemente de si se produce una excepción o no usamos la cláusula finally.


Si no existe ninguna excepción se ejecutarán los bloques 1,2,4,5 de forma secuencial. 
Si existe una excepción de tipo aritmético se ejecutarán los bloque 1,2*,3,4,5 y si existe una excepción de otro tipo se ejecutarán los bloques 1,2*,4. 
Si el cuerpo del bloque try llega a comenzar su ejecución, el bloque finally siempre se ejecutará detrás del bloque try si no se producen excepciones, después de un bloque catch si éste captura una excepción, y justo después de que se produsca la excepción si el catch no captura la excepción y antes de que la excepción vaya hacia arriba.


BIBLIOGRAFIA


INTERFACES EN JAVA

¿Qué es una interface en Java?

Una interfaz en java se puede definir  como un conjunto de métodos abstractos y propiedades. En donde se indica que se debe hacer pero sin una implementación. Las clases que implementen estas interfaces describiran la lógica del comportamiento de todos los métodos de la interfaz. 

Una interfaz en Java define un tipo cuyos métodos están todos sin implementar esto es semejante a una herencia múltiple pero de clases abstractas en una clase. Cuando una clase implementa una interface, puede:

  • Implementar los métodos de la interface sobreescribiéndolos
  • No implementar los métodos de la interface: obligatoriamente será una clase abstracta y obligatoriamente ha de llevar la palabra clave abstract en su encabezado para así indicarlo.

Ventajas al utilizar interfaces:
  • Se organiza la programación.
  • Obligar a que ciertas clases utilicen los mismos métodos (nombres y parámetros)
  • Establecer relaciones entre clases que no estén relacionadas.


¿Cómo usar interfaces?

Para trabajar con interfaces, Java utiliza dos palabras reservadas: "interface" e "implements".
modificador_acceso interface NombreInterfaz { código de interfaz }                                       



El modificador de acceso permitido dentro de una interfaz es public o puede no existir.  Los atributos que definamos en el cuerpo de la interfaz deben ser atributos de tipo constante en las clases en las que se implemente.
Para implementar una interfaz en una clase se debe seguir el siguiente orden:

modificador_acceso NombreClase implements NombreInterfaz1 , NombreInterfaz2



Aplicaciones: Ordenación de colecciones de objetos.

Interfaz Comparable

Comparable es una Interfaz del paquete java.lang, esta interfaz nos define un método necesario a definir en nuestra clase para que se pueda implementar dicha interfaz.

Java contiene varios operadores de comparación (<, <=, >, >=, ==, !=) y nos permiten comparar valores primitivos, pero no se pueden utilizar estos operadores para comparar objetos. La interfaz Comparable se utiliza para permitir que los objetos de una clase que
implementa a la interfaz se comparen entre sí. Esta interfaz se utiliza comúnmente para ordenar objetos en una colección, como un arreglo.

Comparable <C> nos obliga a implementar el siguiente método: int compareTo(claseC objeto)


Lo que hace es comparar 2 objetos de la misma clase claseC y se devolver -1, 0 o 1 si el objeto que llama al método es respectivamente menor, igual o mayor que el objeto especificado en el método por objeto.

objecto1.comparteTo(objeto2);

                                             negativo si      objeto1 < objeto2
                                             cero si             objeto1 = objeto2
                                             positivo si        objeto1 > objeto2


Si un objeto es mayor o menor que otro es lo que tenemos que hacer nosotros. 
Las clases básicas del API de Java, como String, Integer, File, Date y demás, ya la implementan, con el orden esperado (alfabético, ordinal, cronológico, etc), así que solo tendremos que preocuparnos de este interface con nuestras clases propias que pueden ser complejas.

Clase Collections.

Esta clase que se encuentra e el paquete java.util se compone exclusivamente de los métodos estáticos que operan en o devuelven colecciones, esta clase tiene un método de ordenamiento de collecciones de elementos llamado Sort.

Método Sort


Ordena la lista especificada en orden ascendente, de acuerdo con el orden natural de sus elementos.


Este método es capaz de ordenar cualquier colección que implemente el interface java.util.Listjava.util.ArrayList y el orden natural lo indican el método comparteTo que revisamos antes.


EJEMPLOS

Crearemos una clase llamada Estudiante, una clase llamada Curso y una llamada Aplicación.
Como vemos la clase Estudiante implementa la interfaz Comparable


Por lo que tenemos que añadir el método compareto de Comparable, el cual implementaremos su código mas adelante.


Mientras que nuestra clase Curso tendrá como atributos un ArrayList de Estudiante



En nuestra clase Aplicación crearemos una nueva lista de Estudiantes y la añadiremos al array list de la clase Curso.



Para ordenar nuestra lista de estudiantes lo que debemos hacer el modificar nuestro método compareto de la clase Estudiantes según el parámetro deseado:

Para ordenar por el nombre:



Para ordenar por la edad:



Para ordenar por el IRA (indice de rendimiento académico):  



Mientras que en nuestra clase Aplicación utilizaremos el metodo sort de la clase Collections para ordenar de acuerdo al orden natural de sus elementos, es decir de manera en que hayamos modificado el método compareto.



Tendremos las siguentes salidas:

Ordenados alfabeticamente (por nombre): 


Ordenados cronologicamente (por edad):


Ordenados  ordinalmente (por IRA)


Codigo del ejercicio: https://www.dropbox.com/s/zdzbt4odrdq3izq/OrdenarClases.zip?dl=0


Interfaz Clonable


Una clase que implemente este interface le indica al método clone de la clase base Object que puede hacer una copia miembro a miembro de las instancias de dicha clase. Si una clase no implementa esta interface, e intenta hacer una duplicación del objeto a través de la llamada al método clone de la clase base Object, da como resultado una excepción del tipo CloneNotSupportedException

La clase base Object tiene un métodollamado clone, que se redefine en la clase derivada para realizar una duplicación de un objeto de dicha clase.
Para hacer una copia de un objeto de cualquier clase, se ha de seguir los siguentes pasos

  • Se ha de implementar el interface Cloneable
  • Se ha de redefinir el método clone de la clase base Object

EJEMPLOS

Crearemos una clase llamada Paciente y una llamada Aplicación.
Como vemos la clase Paciente implementa la interfaz Clonable

Para poder usar el método clone() se debe redefinir este metodo en la clase Paciente de la siguiente forma:


Si una clase que no implementa la interfaz Cloneable intenta hacer una duplicación del objeto a través de la llamada al método clone de la clase base Object, da como resultado una excepción del tipo CloneNotSupportedException.
En nuestra clase aplicación creamos un nuevo objeto de tipo Paciente y luego lo clonamos.


Se puede observar a la salida que son dos objetos con diferente dirección de memoria pero que tienen los mismos estados en sus atributos:






Bibliografia