Pocas son las versiones de Java que han marcado un antes y un después en
el lenguaje, por ejemplo, la introducción de anotaciones y genéricos de la
Java 5, o los Lambda expresions y paralelismo de Java 8 y finalmente la
llegada de Java 9 trae algunas mejores importantes que son dignas de
elogiar.
Como sea, la verdad es que cada versión de Java trae una gran expectativa,
y por lo general cada versión trae tantos cambios como para escribir un libro
completo, por lo que en este artículo trataremos de hablar de lo más
relevante y que como programadores podría ser de los más interesante, así
que, sin más preámbulos, veamos las mejoras.
Sistema de módulos
Sin lugar a duda, el sistema de módulos es la característica más relevantes
y esperadas, pues desde su nacimiento, el JDK de Java ha sido monolítico,
lo que implica que tenías todos o nada. En este sentido, las aplicaciones Java
requerían montar en el classpath todas las clases del JDK + las clases de los
proyectos. lo que implicaba varios problemas, como el espacio requerido para
cargar todas las clases al classpath o la colisión en los nombres de las clases
de diferentes paquetes.
El cual deberá declarar mediante la sentencia export los paquetes que podrán
ser accedidos por otros módulos, y la sentencia requires para importar los
módulos de los que depende. Por default, todos los paquetes que no sean
expuestos serán privados de forma predeterminada.
En la imagen podemos observar que el Modulo A requiere del MóduloB, y que
el Modulo B expone el paquete com.centripio.moduleb, aunque por otro lado,
vemos que el ModuloA importa al módulo completo, no sus paquetes.
Servicios
Otra de las cosas que ofrece la modularización, es exponer servicios. Los
servicios son clases que son expuestas mediante una interface, que la
implementación real queda totalmente oculta, pues no es necesario exponer
mediante export la implementación.
El Módulo C indica que requiere (requires) del módulo Hello, como podemos
ver, no hacemos referencia a los paquetes expuestos, sino a todo el modulo.
Por otra parte, le estamos indicando que el módulo expone un servicio
(provides) el cual se expone encapsulado mediante la interface
com.centripio.hello.IHelloWorld del Módulo Hello, pero la implementación
real es la clase com.centripio.modulec.impl.HelloWorldCImpl la cual está
dentro del Módulo c. notemos que en ningún momento estamos exponiendo
mediante export el paquete de la clase de implementación.
Ahora bien, veamos cómo se ejecuta esto dentro del método Main.
Por otra parte, Java 9 nos permite ejecutar nuestra aplicación solo con los
módulos necesario.
Métodos privados en interfaces
Una de las novedades que introdujo el Java 8 es la implementación default
de las interfaces, sin embargo, todos los métodos tenían que ser públicos.
Con la llegada de Java 9, esto cambia, y es posible definir métodos privados,
por lo que solo podrán ser utilizados en dentro de la misma interface, más
precisamente, solo se podrán llamar dentro de los métodos por default. Ya
que fuera de la interface no será accesibles, incluso en las clases que las
implementen.
UnsupportedOperationException
NullPointerException.
devolver la misma instancia para una lista con los mismos valores, por lo que:
El soporte para HTTP 2.0 es sin duda lo más relevante del API, porque
mostraremos un ejemplo simple de cómo utilizarlo. No quiero entrar en
detalles acerca de las mejoras de HTTP 2.0 pues en el tema central de este
artículo.
Lo primero que debemos de saber es que esta nueva API no viene como
parte del API Base de Java, por lo que debemos de importarlo como módulo:
Hay varias cosas que no podemos abarcar en este artículo, pero cabe
mencionar que el API de HTTP soporta conexiones síncronas y asíncronas
además que permite crear clientes de WebSockets.
TIFF Image I/O
El formato TIFF ha venido tomando fuerza, pues es el formato
predeterminado para el sistema operativo IOS. Pero a pesar de tener mucha
fuerza, la realidad es que hasta la versión 9 de Java se empaqueta como una
solución definitiva.
Multi-Resolution Images
Con la llegada de Smartphones, tablets y pantallas de diferentes
resoluciones, se ha complicado la forma en que mostramos las imágenes en
el dispositivo, pues en muchas ocasiones no vemos obligados a
redimensionar las imágenes o crear condiciones que muestren una imagen u
otra, según la resolución de pantalla. Cabe resaltar que esta nueva
funcionalidad no se encarga de redimensionar una imagen, sino que, dado
una serie de imágenes, nos ayuda a seleccionar la que mejor se ve para una
resolución dada.
Con la llegada de Java 9, se agregan una serie de clases de utilidad que nos
ayudarán a seleccionar la imagen más adecuada para una resolución de
pantalla. Las clases son las siguientes:
MultiResolutionImage: Interface base para todas las imágenes multi
resolución
funcionalidad base
mínima.
Otra de las ventajas que ofrece este nuevo API, es que permite registrar
mensajes en el log antes de que todos los módulos estén cargados.
VisualVM removido
La herramienta VisualVM que es utilizada analizar la JVM en tiempo de
ejecución fue agregada como parte del JDK en la versión 6 del JDK, pero a
partir de la versión 9 de Java, es removida del JDK y se tendrá que descargar
por separado.
Bibliografía
https://www.genbetadev.com/java-j2ee/el-futuro-y-java-9
http://www.cleformacion.com/-/la-actualizacion-de-java-9-ya-esta-lista-para-su-
lanzamiento
http://www.clubdetecnologia.net/blog/2017/java-9-que-herramientas-soportan-las-
caracteristicas-de-modularidad/
http://centripio.io/java-9-analisis-de-las-novedades/
https://picodotdev.github.io/blog-bitix/2017/09/novedades-de-java-9-mas-alla-de-la-
modularidad/