Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
CONTENIDO
PLANIFICACION
SEMANA 1:
11 Jul: Introduccin a J2SE 1.5. Montaje del entorno 12 Jul: Introduccion a JSF. Navegacion entre pantallas 13 Jul: Componentes estandar. Validaciones 14 Jul: Eventos
PLANIFICACION
SEMANA 2:
18 Jul: Facelets 19 Jul: A4J 20 Jul: Richfaces 21 Jul: Introduccion a EJBs y cierre
J2SE 5.0
Novedades
Novedades en el lenguaje:
Varargs
Varargs - declaracion
Solo puede haber un unico argumento variable en la declaracion del metodo. El argumento variable tiene que ser el ultimo.
Varargs - invocacion
Invocacion:
enviarEmail ("Saludo","pepe@dominio.com","juan@dominio.com");
For each
Tambien llamado bucle FOR mejorado Sintaxis sencilla para recorrer arrays o cualquier implementacion del interfaz Iterable. Forma de uso:
for ( tipoElementos elementoAuxiliar : estructuraElementos ) { ... }
Antes:
for ( int i = 0; i < arrayStrings.length; i++ ) { System.out.println( array[i] ); }
Ahora
for ( String tmp : arrayStrings ) { System.out.println( tmp ); }
Tipos genericos
Permite escribir interfaces o metodos sin definir los tipos de los argumentos o de las variables. Similar a los templates de C++.
Definimos una clase Box que pueda almacenar cualquier tipo de objeto:
public class Box { private Object object; public void add(Object object) { this.object = object; } public Object get() { return object; }
Los genericos asi definidos pueden ser usados para declarar variables en cualquier punto de la clase.
Se llaman metodos genericos a aquellos que declaran un tipo generico como parametro
public class Aleatorizador { // Devuelve aleatoriamente uno de los dos objetos public <T> T elegir(T x, T y) { T elegido; if ((Math.random()-0.5)>0) elegido = x; else elegido = y; } return elegido;
El ambito del tipo generico definido como parametro es local, visible solo dentro del metodo!
Al invocar el metodo generico, no hace falta indicar el tipo. Java lo deduce de la clase del parametro
public static void main(String[] args) { Aleatorizador aleatorizador = new Aleatorizador(); String cadena = aleatorizador.elegir("Cadena 1", "Cadena 2"); System.out.println(cadena); }
Se puede forzar que el tipo generico implemente un interfaz o extienda de una clase (bound)
public class HashEntry <CLAVE extends Number, VALOR> { private CLAVE clave; private VALOR valor; public HashEntry(CLAVE clave, VALOR valor) { this.clave = clave; this.valor = valor; } ... }
public class HashEntry <CLAVE extends Number & Serializable, VALOR> { ... }
Funcionara esto?
Recordemos que Integer, Float, Double, Long, Short, etc derivan de Number
Esto?
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Type mismatch: cannot convert from Box<Number> to Box<Integer>
Y funcionara esto?
COMODINES!
Box<?> declara una variable capaz de almacenar una instancia de Box con cualquier tipo de dato generico.
Podemos hacer un bounding con el comodin y obligar a que el comodin derive de una clase o implemente un interfaz
Box<? extends Number> caja; caja = new Box<Integer>(); caja = new Box<Double>(); caja = new Box<String>(); //Error de compilacion
En el ejemplo, caja puede contener cualquier objeto de la clase Box con tipo Number o derivado.
En este otro ejemplo, caja puede contener cualquier objeto de la clase Box con tipo Integer o un padre de Integer.
Box<? super Integer> caja; caja = new Box<Integer>(); caja = new Box<Number>(); caja = new Box<Float>(); // Error de compilacion
Los tipos genericos solo existen en tiempo de compilacion, no en ejecucion. Una vez compilado el codigo, se traducen a tipos normales y no queda rastro de ellos en el bytecode.
Una limitacion importante del uso de genericos es que no se puede instanciar un tipo generico
public class Box<T> { private T t; public Box () { t = new T(); //Error! } ... }
No se puede instanciar un objeto de tipo generico puesto que el compilador no tiene ni idea de los constructores.
t = (T) t.getClass().newInstance();
A partir de la version 5 de Java, toda la librera (paquete) java.utils ha sido portada usando tipos genericos. Ejemplo:
ArrayList<Integer> lista = new ArrayList<Integer>();
Tipos enumerados
Nuevo tipo caracterizado por tener un numero limitado de valores posibles. Sustituyen (en ciertos casos) a las variables static final int.
Tipos enumerados
Declaracion:
public enum DiasSemana { LUNES,MARTES,MIERCOLES,JUEVES,VIERNES,SABADO,DOMINGO }
Uso:
DiasSemana dia = DiasSemana.DOMINGO;
Tipos enumerados
Tipos enumerados
Y ordinal()...
if (dia.ordinal() == 4) { System.out.println("Es el quinto dia de la semana!"); }
Y values()...
DiasSemana.values(); for (DiasSemana d : DiasSemana.values()) { System.out.println(d); }
Autoboxing
Anotaciones
Sintaxis que permite asociar informacion en forma de par atributo-valor a los diferentes elementos de programacion (paquetes, clases, metodos, atributos, variables...). No modifican la ejecucion del programa de por si. Simplemente aaden informacion que en tiempo de compilacion o ejecucion es extraida e interpretada por el compilador, herramientas o librerias.
Anotaciones - Sintaxis
Forma general
@TipoAnotacion(nombre1=valor1,nombre2=valor2,...)
Anotaciones - Sintaxis
Avisa al compilador de que el metodo anotado sobrecarga el metodo de una superclase. El compilador avisara si no existe dicho metodo en la superclase.
@Override public String toString() { ... }
Deprecated:
Avisa al compilador de que el elemento anotado esta obsoleto. El compilador avisara si se usa un elemento obsoleto dentro de codigo no obsoleto
@Deprecated public class Box {...}
SuppressWarning:
Indica al compilador que warnings debe omitir. Se pasa un array de valores con los warnings omitidos (dependen del compilador): all, deprecation, checked, falltrough, path, serial, finally, unused...
@SuppressWarnings("unused") public class test { } private int c;
Anotaciones - Definicion
Anotaciones - Definicion
Anotaciones - Meta-anotaciones
Una meta-anotacion es una anotacion que se aplica a la definicion de otra anotacion Sirven para indicar el comportamiento de las anotaciones. Existen unas cuantas meta-anotaciones predefinidas: Documented, Inherited, Retention, Target
Anotaciones - Meta-anotaciones
Retention:
Especifica la politica para mantener en memoria la anotacion Unico miembro value con los siguientes posibles valores (Enum RetentionPolicy)
SOURCE: La anotacion solo esta en el codigo fuente. Se descarta por el compilador. CLASS: La anotacion se almacena en el fichero de la clase, pero no es accesible en tiempo de ejecucion. Comportamiento por defecto RUNTIME: La anotacion se almacena en el fichero de clase y es accesible en tiempo de ejecucion.
Anotaciones - Meta-anotaciones
Target:
Indica para que elementos es aplicable la anotacion: Unico miembro value con los siguientes posibles valores (Enum ElementType):
TYPE: clase, interfaz o enum METHOD PARAMETER CONSTRUCTOR LOCAL_VARIABLE ANNOTATION_TYPE PACKAGE
Anotaciones - Definicion
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PACKAGE, ElementType.TYPE, ElementType.METHOD}) public @interface Registro { String programador(); int version(); String fecha(); }
Anotaciones - Extraccion
Anotaciones Extraccion
import java.lang.annotation.Annotation; import java.lang.reflect.Method; public class TestMiClase { public static void main(String[] args) { MiClase miClase = new MiClase(); Class clase = miClase.getClass(); Registro anotacion; Anotacion = (Registro)clase.getAnnotation(Registro.class); System.out.println(anotacion); System.out.println("REGISTRO - Programador: " + anotacion.programador() + " ; Version: " + anotacion.version()); for (Method metodo : clase.getMethods()) { for (Annotation anotacion2 : metodo.getAnnotations()) System.out.println("METODO: " + metodo.getName() + " - " + anotacion2); } } }
Ejercicio 1
Implementar, utilizando los tipos genericos, una pila de datos. Utilice internamente un arrayList para almacenar los elementos. El metodo toString debe imprimir ordenadamente todos los elementos almacenados. Utilizar un bucle for mejorado para ello. Implementar el interfaz Iterable para que pueda ser recorrida la pila usando un for-each. Cree un constructor con una lista indeterminada de parametros (de tipo generico). Dicha lista de parametros sera utilizada para inicializar la pila
Ejercicio 2
Implementar, utilizando los tipos genericos, una hash-table. La clave sera un tipo generico derivado de Number. El valor sera un tipo generico. Se iran ordenado los datos por el valor de la clave segn se insertan en la hash-table
Ejercicio 3
Programar un DAO que sea capaz de gestionar cualquier tipo de objeto. Cada instancia de este DAO se particularizara para una clase concreta.
DAOGenerico<usuario> usuarioDAO = new DAOGenerico<usuario>();
En vez de utilizar una DB, almacenaremos los datos en una estructura de memoria dinamica (ej: HashMap)
Ejercicio 4
Modifique el DAO del ejercicio 3 de modo que se pueda configurar su comportamiento mediante anotaciones. La anotacion @Limit indicara el numero maximo de elementos a almacenar.