Monday, November 27, 2006

Novedades en Java 1.5

Autor: Ignacio Iborra
© Departamento de Ciencia de la Computación e Inteligencia Artificial, Universidad de Alicante, 2004

1. Introducción

En este documento se resumen las principales novedades que ofrece la versión 1.5 de Java, separándolas en diferentes áreas. Para una explicación más detallada, consultar la página de Sun:

http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html

2. Novedades en la máquina virtual

Autoajuste de memoria mejorado

La capacidad de autoajustar la cantidad de memoria necesaria (pila, recolector de basura, etc) se ve mejorada en esta versión.

Compartir clases

Al instalar la máquina virtual, se cargan en memoria un conjunto de clases del sistema, en forma de representación interna, de forma que las siguientes llamadas a la máquina virtual ya encuentren estas clases mapeadas en memoria, y se permita que los datos de estas clases se compartan entre múltiples procesos dentro de la JVM.

Ajuste del recolector de basura

Relacionado con el autoajuste de memoria, el recolector de basura también se autoadapta a las necesidades de memoria de la aplicación, para evitar que el usuario tenga que ajustar su tamaño y características desde línea de comandos.

Tratamiento de errores fatales

El mecanismo de listado de errores fatales se ha mejorado de forma que se obtengan mejores diagnósticos a partir de las salidas generadas por dichos errores.

3. Novedades en el lenguaje

Tipos de datos parametrizados (generics)

Esta mejora permite tener colecciones de tipos concretos de datos, lo que permite asegurar que los datos que se van a almacenar van a ser compatibles con un determinado tipo o tipos. Por ejemplo, podemos crear un Vector que sólo almacene Strings, o una HashMap que tome como claves Integers y como valores Vectors. Además, con esto nos ahorramos las conversiones cast al tipo que deseemos, puesto que la colección ya se asume que será de dicho tipo.

Ejemplo

// Vector de cadenas
Vector v = new Vector();
v.addElement("Hola");
String s = v.getElementAt(0);
v.addElement(new Integer(20)); // Daría error!!

// HashMap con claves enteras y valores de vectores
HashMap hm = new HashMap();
hm.put(1, v);
Vector v2 = hm.get(1);

Autoboxing

Esta nueva característica evita al programador tener que establecer correspondencias manuales entre los tipos simples (int, double, etc) y sus correspondientes wrappers o tipos complejos (Integer, Double, etc). Podremos utilizar un int donde se espere un objeto complejo (Integer), y viceversa.

Ejemplo

Vector v = new Vector();
v.addElement(30);
Integer n = v.getElementAt(0);
n = n+1;

Mejoras en bucles

Se mejoran las posibilidades de recorrer colecciones y arrays, previniendo índices fuera de rango, y pudiendo recorrer colecciones sin necesidad de acceder a sus iteradores (Iterator).

Ejemplo

// Recorre e imprime todos los elementos de un array
int[] arrayInt = {1, 20, 30, 2, 3, 5};
for(int elemento: arrayInt)
System.out.println (elemento);

// Recorre e imprime todos los elementos de un Vector
Vector v = new Vector();
for(String cadena: v)
System.out.println (cadena);

Tipo enum

El tipo enum que se introduce permite definir un conjunto de posibles valores o estados, que luego podremos utilizar donde queramos:

Ejemplo

// Define una lista de 3 valores y luego comprueba en un switch
// cuál es el valor que tiene un objeto de ese tipo

enum EstadoCivil {soltero, casado, divorciado};
EstadoCivil ec = EstadoCivil.casado;
ec = EstadoCivil.soltero;
switch(ec)
{
case soltero: System.out.println("Es soltero");
break;
case casado: System.out.println("Es casado");
break;
case divorciado:System.out.println("Es divorciado");
break;
}

Imports estáticos

Los imports estáticos permiten importar los elementos estáticos de una clase, de forma que para referenciarlos no tengamos que poner siempre como prefijo el nombre de la clase. Por ejemplo, podemos utilizar las constantes de color de la clase java.awt.Color, o bien los métodos matemáticos de la case Math.

Ejemplo

import static java.awt.Color;
import static java.lang.Math;

public class...
{
...
JLabel lbl = new JLabel();
lbl.setBackground(white); // Antes sería Color.white
...
double raiz = sqrt(1252.2); // Antes sería Math.sqrt(...)
}

Argumentos variables

Ahora Java permite pasar un número variable de argumentos a una función (como sucede con funciones como printf en C). Esto se consigue mediante la expresión "..." a partir del momento en que queramos tener un número variable de argumentos.

Ejemplo

// Funcion que tiene un parámetro String obligatorio
// y n parámetros int opcionales


public void miFunc(String param, int... args)
{
...
// Una forma de procesar n parametros variables
for (int argumento: args)
{
...
}
...
}

...
miFunc("Hola", 1, 20, 30, 2);
miFunc("Adios");

Metainformación

Se tiene la posibilidad de añadir ciertas anotaciones en campos, métodos, clases y otros elementos, que permitan a las herramientas de desarrollo o de despliegue leerlas y realizar ciertas tareas. Por ejemplo, generar ficheros fuentes, ficheros XML, o un Stub de métodos para utilizar remotamente con RMI.

Un ejemplo más claro lo tenemos en las anotaciones que ya se utilizan para la herramienta Javadoc. Las marcas @deprecated no afectan al comportamiento de los métodos que las llevan, pero previenen al compilador para que muestre una advertencia indicando que el método que se utiliza está desaconsejado. También se tienen otras marcas @param, @return, @see, etc, que utiliza Javadoc para generar las páginas de documentación y las relaciones entre ellas.

Ejemplo

// Definición de una interfaz mediante metainformacion

public @interface MiInterfaz
{
int metodo1();
String metodo2();
}

4. Novedades en librerías principales

Red

Se han añadido cambios y mejoras para el trabajo en red, como:

  • Soporte para IPv6 en Windows XP y 2003
  • Establecimiento de timeouts para conectar y leer
  • API para lanzar aplicaciones RMI a través de inetd
  • La clase InetAddress permite testear si una URL es alcanzable (utilidad ping)
  • Otras mejoras en el tratamiento de cookies, servidores proxy, tratamiento de URLs, etc.

Seguridad

Hay bastantes mejoras en seguridad. Se da soporte a más estándares de seguridad (SASL, OCSP, TSP, etc), hay mejoras en la escalabilidad a través de SSLEngine, en criptografía, etc.

Internacionalización

Mediante la internacionalización podemos construir una aplicación que se adapte a varios idiomas, formatos monetarios, de fecha, etc, sin tener que reprogramarla. En este aspecto, se añaden mejoras en la versión 1.5, relacionadas con:

  • La gestión de juegos de caracteres se basa en el formato Unicode 4.0, lo que afecta a las clases Character y String, entre otras.
  • La clase DecimalFormat se ha modificado para poder procesar elementos de tipo BigDecimal o BigInteger sin perder precisión
  • Se han añadido nuevos Locales soportados, como el vietnamita.

Formateador

La clase Formatter permite dar formato (justificación y alineamiento, formatos numéricos, de fecha, etc) a las cadenas y otros tipos de datos, siguiendo un estilo parecido al printf de C. También se permite mediante la interfaz Formattable dar formatos (limitados) a tipos creados por el usuario.

Ejemplo

// Uso de formatter para construir cadenas formateadas
StringBuilder sb = new StringBuilder();
Formatter f = new Formatter(sb, Locale.US);
f.format("Hola, %1$2s, esta es tu visita numero %2$d", "Pepe", 20);
// Resultaría: "Hola, Pepe, esta es tu visita numero 20"

// También se tienen unos métodos predefinidos en ciertas clases
System.out.format("Hola, %1$2s, esta es tu visita numero %2$d", "Pepe", 20);
System.err.printf("Hola, %1$2s, esta es tu visita numero %2$d", "Pepe", 20);
String s = String.format("Hola, %1$2s", "Pepe");

Escaneador

La clase Scanner permite parsear un flujo de entrada (fichero, cadena de texto, stream de datos, etc), y extraer tokens siguiendo un determinado patrón o tipo de datos. También se permite trabajar con expresiones regulares para indicar qué patrones se deben buscar.

Ejemplo

// Lectura de enteros de la entrada estándar
Scanner sc = Scanner.create(System.in);
int n = sc.nextInt();

// Lectura de todos los doubles de un fichero
Scanner sc = Scanner.create(new File("miFich.txt"));
while (sc.hasNextDouble())
double d = sc.nextDouble();

// Uso de otros delimitadores
String s = "Esto hola es hola 1 hola ejemplo";
Scanner sc = Scanner.create(s).useDelimiter("\\s*hola\\s*");
System.out.println(sc.next());
System.out.println(sc.next());
System.out.println(sc.next());
// Sacaría Esto \n es \n 1

Arquitectura de JavaBeans

La arquitectura de JavaBeans se encuentra dentro del paquete java.beans. Se ha añadido una nueva clase, IndexedPropertyChangeEvent, subclase de PropertyChangeEvent, para dar soporte a eventos que respondan a cambios en propiedades indexadas (propiedades que utilicen un índice para identificar la parte del bean que haya cambiado). También se han añadido mejoras a la hora de crear editores de propiedades de beans (PropertyEditor), como el método createPropertyEditor(...), y constructores públicos para la clase PropertyEditorSupport.

Arquitectura de colecciones

Como se ha comentado antes, las colecciones (estructura que contiene clases e interfaces como Collection, Vector, ArrayList, etc) dan soporte a nuevas características del lenguaje, como el autoboxing, mejoras en los bucles (for) , y el uso de generics. Además, se han añadido interfaces nuevos, como Queue, BlockingQueue y ConcurrentMap, con algunas implementaciones concretas de dichas interfaces. Además, se tienen nuevas implementaciones de List, Set y Map.

Manipulación de bits

Los wrappers de tipos simples (es decir, clases como Integer, Long, Double, Char) soportan operaciones de bits, como highestOneBit, lowestOneBit, rotateLeft, rotateRight, reverse, etc.

Elementos matemáticos

El paquete java.math también ha sufrido modificaciones, como la adición en la clase BigDecimal de soporte para cálculo en coma flotante de precisión fija. Clases como Math o StrictMath además incluyen soporte para senos y cosenos hiperbólicos, raíces cúbicas o logaritmos en base 10. Por último, también se da soporte al uso de números hexadecimales con coma flotante.

Serialización

Además de corregir errores previos en la serialización, se da soporte para serializar el nuevo tipo enum, aunque la forma de serializarlo difiere ligeramente de los tipos tradicionales.

Hilos

Se han añadido los paquetes java.util.concurrent, java.util.concurrent.atomic y java.util.concurrent.locks, que permiten crear diversas infraestructuras de hilos, como pooling de hilos o colas de bloqueos, liberando al programador de tener que controlar todas estas estructuras "a mano". En definitiva, se da soporte para automatizar la programación concurrente.

Además, a la clase Thread se le han añadido los métodos getStackTrace y getAllStackTraces para obtener la traza de los hilos en un momento dado.

Monitorización y gestión

Se tienen mejoras en el control o la monitorización tanto de las aplicaciones Java como de la máquina virtual (JVM), a través de la API de JMX.

5. Novedades en librerías adicionales

RMI

Se tienen dos mejoras fundamentales en RMI:

  • Generación dinámica de Stubs: se generan en tiempo de ejecución, sin necesidad de utilizar rmic previamente. Sólo tendremos que utilizarlo para generar Stubs para clientes que funcionen con versiones anteriores de Java.
  • Lanzamiento de rmid o un servidor RMI Java desde inetd/xinetd.

JDBC

En Java 1.4 se introdujo la interfaz RowSet, que permitía pasar datos entre componentes. En Java 1.5 se han desarrollado 5 implementaciones de dicha interfaz, para cubrir 5 posibles casos de uso:

  • JdbcRowSet: para encapsular un ResultSet o un driver que utilice tecnología JDBC
  • CachedRowSet: desconecta de la fuente de datos y trabaja independientemente, salvo cuando esté obteniendo datos de dicha fuente o volcando datos en ella.
  • FilteredRowSet: hereda de la anterior, y se utiliza para obtener un subconjunto de datos
  • JoinRowSet: hereda de CachedRowSet y se emplea para unir múltiples objetos RowSet.
  • WebRowSet: hereda de CachedRowSet para procesar datos XML.

JNDI

  • Mejoras en la clase javax.naming.NameClassPair para poder acceder al nombre completo del servicio de directorio.
  • Soporte para controles estándar de LDAP
  • Soporte para manipular nombres de LDAP

6. Novedades en la interfaz de usuario

Internacionalización

Para permitir renderizar texto multilingüe utilizando fuentes lógicas, se tienen en cuenta tanto las fuentes del cliente como las del locale que tengamos instalado. Además, AWT utiliza APIs Unicode en Windows 2000 y XP, con lo que se puede manejar texto sin estar limitado a la configuración de locale de Windows.

Java Sound

Para el tratamiento del sonido desde Java, se tienen también los siguientes cambios, principalmente:

  • Se permite el acceso a puertos en todas las plataformas
  • También está disponible la entrada/salida MIDI

Java 2D

  • Se cachean en memoria todas las imágenes construidas a partir de BufferedImage
  • Métodos para controlar la aceleración hardware en imágenes
  • Añadido soporte para aceleración hardware con OpenGL en Solaris y Linux.
  • Creación de fuentes a partir de ficheros y flujos de entrada
  • Se ha mejorado la renderización de texto.

Flujos de imágenes

Se permite, además de los formatos de imágenes ya soportados (PNG, JPG, etc), leer y escribir imágenes BMP y WBMP.

AWT

Las novedades más significativas son:

  • La clase MouseInfo almacena información sobre la posición del ratón en el escritorio
  • Se tienen nuevos métodos en la clase Window para especificar la posición para las nuevas ventanas que se creen. También se tienen métodos para asegurar que una ventana permanezca siempre en primer lugar (aunque esta característica no funciona bien en algunas versiones de Solaris o Linux)
  • Nuevos métodos para acceder y notificar sobre el contenido del portapapeles.
  • Se han corregido errores existentes en los layout managers: GridBagLayout y FlowLayout.
  • Cambios y correcciones en eventos de teclado (nuevos mapeos de teclas, redefinición de métodos, etc), y de acción (correcciones en cuanto al uso de Enter como evento de acción).

Swing

Entre otras, se tienen las novedades:

  • Se proporcionan nuevos look & feels (uno de ellos, Synth, es skinnable, es decir, se puede personalizar el skin que muestra)
  • Se añade soporte para imprimir JTables.
  • Se permite definir menús contextuales (popup menus) en componentes, para que muestren las opciones que queramos. Para ello se tiene la clase JPopupMenu.
  • Se han añadido mejoras en JTextArea para facilitar el scroll por su contenido, y la actualización cuando se modifique su texto.
  • Podremos utilizar el método JFrame.add(...), en lugar de JFrame.getContentPane().add(...)
// Antes
JFrame f = new JFrame();
f.getContentPane().add(new JButton("Hola"));

// Ahora
JFrame f = new JFrame();
f.add(new JButton("Hola"));

7. Novedades en despliegue de aplicaciones

Despliegue general

Se tienen, entre otras, las siguientes novedades en cuanto a despliegue de aplicaciones:

  • Se ha unido gran parte de la funcionalidad entre el Java Plug-in y Java Web Start, de modo que ahora tienen un Java Control Panel común para ambos
  • Las aplicaciones desplegadas se pueden configurar mediante un fichero de configuración, que puede ser accedido a través de una URL, y establecer ciertos parámetros de la aplicación.
  • El formato de compresión Pack200 permite tener ficheros JAR ultra-comprimidos (hasta 1/8 de su tamaño original), reduciendo los tiempos de descarga, o de despliegue mediante Java Web Start.
  • Inclusión de marcas de tiempo (timestamps) en los ficheros JAR firmados, de forma que se sabe cuándo se concedió el certificado para el fichero, y se previene así el uso de JARs cuyo permiso ya caducó.

Java Web Start

Hay también cambios específicos de Java Web Start, como son:

  • Supresión del Application Manager, cuya mayor funcionalidad se ha encapsulado dentro del nuevo Java Control Panel, y el JNLP Cache Viewer, una nueva herramienta que permite gestionar las aplicaciones descargadas.
  • Supersión del Developer Bundle, ya que Java Web Start está completamente integrado con JRE y SDK, y los elementos que contenía dicho bundle ahora están integrados en Java.
  • Se tiene una caché de sistema, de forma que el administrador del sistema puede cargar al inicio programas en la caché de sistema, de forma que sean compartidas y accesibles por múltiples usuarios.
  • Hay también una facilidad de importación, de forma que se facilita la instalación desde CDs, donde el código se carga primero desde un lugar y luego se actualiza desde otro. También permite preinstalar aplicaciones y librerías en caché, sin ejecutarlas.

8. Novedades en herramientas

JPDA

JPDA es un conjunto de interfaces utilizadas para depurar en entornos y sistemas de desarrollo. En la versión 1.5 se tienen nuevas mejoras y funcionalidades de esta herramienta. Muchas de estas nuevas funcionalidades se han añadido para adaptar las nuevas características de la versión 1.5 de Java, como los argumentos variables, imports estáticos, etc.

JVMTI

JVMTI (Java Virtual Machine Tool Interface) es una nueva interfaz de programación nativa para utilizar en herramientas de desarrollo y monitorización. Forma parte de las interfaces contenidas en JPDA para depuración. Permite chequear el estado y controlar la ejecución de una aplicación.

Compilador (javac)

Se han añadido algunas características a la hora de utilizar el compilador, como son los parámetros:

  • - source 1.5 : habilita las nuevas características de la versión 1.5 de Java, para ser tenidas en cuenta por el compilador. Lleva implícito también un parámetro -target 1.5
  • -target 1.5: permite al compilador utilizar características específicas de Java 1.5 en las librerías y la máquina virtual.
  • -Xlint: permite producir warnings sobre código que, aunque es correcto, puede ser problemático debido a su construcción.

Herramienta javadoc

Se tienen nuevas funcionalidades en la herramienta javadoc. Como en otros elementos, muchos de los cambios dan soporte a características nuevas de Java 1.5 (generics, tipo enum, etc). Se tienen también marcas nuevas, como regression para indicar funcionalidades que se desaconsejaron en versiones anteriores, pero que han sido corregidas en la nueva. También se da soporte a anotaciones para generar metainformación que utilizar en otros programas.

No comments: