sábado, 10 de febrero de 2018

Que trae de nuevo Java 9 ?


Voy a hacer un minipost de las características nuevas que trae Java 9, luego desarrollo cada una de forma individual.

JShell: REPL: Porfin!!! un repl en java. Para los que no saben que es un repl, la wikipedia dice lo siguiente : Un bucle Lectura-Evaluación-Impresión ("REPL" o "Read-Eval-Print-Loop"), también conocido como alto nivel interactivo o consola de lenguaje, es un entorno de programación computacional simple e interactivo que toma las entradas individuales del usuario, las evalúa y devuelve el resultado al usuario; un programa escrito en un entorno REPL es ejecutado parte por parte.

Métodos privados en las interfaces: Java 8 nos proporcionó la implementación de métodos predeterminado y estático en Interfaces; sin embargo, no podemos crear métodos privados en las interfaces. Si nos encontramos en una situación en la que tenemos múltiples métodos predeterminados en una interfaz que contiene la misma funcionalidad. En este escenario, normalmente refactorizaríamos estos métodos predeterminados para llamar a un método privado que contenga la funcionalidad compartida y ahora podemos hacer esto en java 9 :

public interface MyInterface {

    default void interfaceDefaultMethod() { init(); }

    default void interfaceSecondDefaultMethod() { init(); }

    // This is the declaration of the Private Method in Interface

    private void init() { ... }

}

Java 9 Module System: Claramente esto necesita un post en si. Pero para resumir podemos decir: Hasta la versión de Java 8 estábamos usando los contenedores monolíticos para diseñar nuestras aplicaciones basadas en Java. Hay dos problemas principales fundamentales con este diseño: Código difícil de encapsular y no hay ninguna noción de dependencias explícitas entre las diferentes partes de un sistema. Para evitar estos problemas fundamentales, Java 9 introdujo el sistema de módulos. Estos son algunos de los principales beneficios que obtenemos del Sistema de Módulos.

Los JDK, JRE, JAR actuales, etc. ahora están divididos en módulos más pequeños, por lo que solo podemos usar los módulos que deseamos. Esto ayuda a reducir la aplicación para dispositivos más pequeños.

Fuerte soporte para encapsulación. Las API internas no críticas están ocultas ahora, ya que los módulos ocultan detalles internos y no deseados de forma muy segura. Esto mejora la seguridad de la aplicación.

Mejoras en Javadoc: Java 9 ahora admite la búsqueda de documentación API internamente dentro de Javadoc.

HTTP/2 Client: Se ha lanzado una nueva API cliente HTTP/2 para soportar el protocolo HTTP/2 y las características de websockets. Este es un reemplazo del antiguo "HttpUrlConnection".

Nuevo esquema de cadena de versiones: Proporciona un formato de cadena de versión simplificado que ayuda a distinguir claramente las versiones principales, secundarias, de seguridad y actualización de parches.

El nuevo formato de cadena de versión se alinea con las prácticas actuales de la industria, en particular las versiones semánticas (servidor). El formato es el siguiente:

$ MAJOR. $ MENOR. $ SEGURIDAD. $ PATCH

Archivos JAR múltiple releases: Extiende el formato de archivo JAR para permitir que múltiples versiones de archivos de clase específicos de versiones de Java coexistan en un solo archivo.

Un JAR de múltiples releases (MRJAR) contiene directorios adicionales versionados para clases y recursos específicos para versiones de plataforma Java particulares. 

Mejoras en Stream API: La mejora en Stream API permite filtrar flujos entrantes de datos de serialización de objetos para mejorar la seguridad y la solidez.

Los clientes de serialización de objetos pueden validar su entrada más fácilmente, y los objetos exportados de Invocación de Método Remoto (RMI) también pueden validar los argumentos de invocación más fácilmente.

Los clientes de serialización implementan una interfaz de filtro que está configurada en un ObjectInputStream. Para RMI, el objeto se exporta a través de RemoteServerRef que establece el filtro en MarshalInputStream para validar los argumentos de invocación ya que no están agrupados.