[Java] ¡Potente! 9 nuevas funciones en Java 9

Original: http://www.javastack.cn/article/2018/nine-java-9-new-features/

Es posible que haya oído hablar del sistema de módulos de Java 9, pero esta nueva versión tiene muchas otras actualizaciones. Aquí hay nueve características nuevas y emocionantes que se lanzarán con Java 9.

1. Sistema de módulos a nivel de plataforma Java

La función definitoria de Java 9 es un nuevo sistema de módulos. Cuando la base del código se hace cada vez más grande, las posibilidades de crear un "código estilo espagueti" complejo y entrelazado aumentan exponencialmente. En este momento, debe enfrentar dos problemas básicos: es difícil encapsular realmente el código y el sistema no tiene un concepto claro de las dependencias entre las diferentes partes (es decir, archivos JAR).

Cada clase pública puede ser accedida por cualquier otra clase pública bajo la ruta de clase, lo que conducirá a un uso inadvertido de API que no quieren ser de acceso público. Además, el classpath en sí mismo tiene problemas: ¿cómo saber que todos los archivos JAR requeridos ya están allí, o hay elementos duplicados? El sistema de módulos resuelve ambos problemas.

Los archivos JAR modulares contienen un descriptor de módulo adicional. En este descriptor de módulo, las dependencias de otros módulos se expresan mediante "requiere". Además, la instrucción "exporta" controla a qué paquetes pueden acceder otros módulos. Todos los paquetes que no se exportan se encapsulan en el módulo de forma predeterminada. El siguiente es un ejemplo de un descriptor de módulo, que existe en el archivo "module-info.java":

module blog {
  exports com.pluralsight.blog;

  requires cms;
}

Podemos mostrar el módulo de la siguiente manera:

Inserte la descripción de la imagen aquí

Tenga en cuenta que ambos módulos contienen paquetes encapsulados porque no se exportan (visualizados con un escudo naranja). Nadie usará accidentalmente clases de estos paquetes. La propia plataforma Java también está modularizada utilizando su propio sistema de módulos. Al encapsular las clases internas del JDK, la plataforma es más segura y la mejora continua es más fácil.

Al iniciar una aplicación modular, la JVM verifica si todos los módulos están disponibles, basándose en la declaración de requisitos, un gran paso adelante que la frágil ruta de clases. Los módulos le permiten hacer cumplir mejor el empaquetado estructurado de su aplicación y depender explícitamente de él. Puede obtener más información sobre el funcionamiento de los módulos en Java 9 en este curso.

2 、 Vinculación

Cuando utiliza módulos con dependencias explícitas y un JDK modular, surgen nuevas posibilidades. Su módulo de aplicación ahora declarará sus dependencias en otros módulos de aplicación y los módulos JDK que utiliza.

¿Por qué no utilizar esta información para crear un entorno de ejecución mínimo que contenga solo los módulos necesarios para ejecutar la aplicación? Esto se puede lograr a través de la nueva herramienta jlink en Java 9. Puede crear una imagen en tiempo de ejecución mínima optimizada para una aplicación sin utilizar una instalación JDK completamente cargada.

3. JShell: REPL interactivo de Java

Muchos lenguajes ya tienen entornos de programación interactivos y Java se está uniendo al club. Puede iniciar jshell desde la consola y comenzar directamente a escribir y ejecutar código Java. La retroalimentación inmediata de jshell lo convierte en una gran herramienta para explorar API y probar funciones de lenguaje.

Inserte la descripción de la imagen aquí

Probar una expresión regular de Java es un buen ejemplo de cómo jshell puede hacer su vida más fácil. El shell interactivo también puede proporcionar un buen entorno de enseñanza y aumentar la productividad. Puede obtener más información al respecto aquí. En el proceso de enseñar a la gente cómo escribir Java, ya no hay necesidad de explicar las tonterías "public static void main (String [] args)".

4. Javadoc mejorado

A veces, las pequeñas cosas pueden marcar una gran diferencia. ¿Estás usando Google como yo para encontrar la página correcta de Javadoc? Esto ya no es necesario. Javadoc ahora admite búsquedas en la documentación de la API. Además, la salida de Javadoc ahora cumple con el estándar compatible con HTML5. Además, notará que cada página de Javadoc contiene información sobre el origen de las clases o interfaces del módulo JDK.

Inserte la descripción de la imagen aquí

5. Método de recolección en fábrica

Por lo general, desea crear una colección (por ejemplo, Lista o Conjunto) en su código y llenarla directamente con algunos elementos. Para crear una instancia de la colección, varias llamadas "add" hacen que el código sea repetitivo. En Java 9, se han agregado varios métodos de fábrica de colecciones:

Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");

Además de ser más breves y de mejor lectura, estos métodos también pueden impedirle elegir una implementación de colección específica. De hecho, está altamente optimizado para devolver una colección de varios elementos del método de fábrica. Esto es posible porque son inmutables: después de la creación, continuar agregando elementos a estas colecciones provocará una "UnsupportedOperationException".

6. API de transmisión mejorada

Durante mucho tiempo, la API Stream ha sido una de las mejores mejoras en la biblioteca estándar de Java. A través de este conjunto de API, se puede establecer una canalización de declaración para la conversión en la colección. Mejorará en Java 9. Se han agregado cuatro métodos nuevos a la interfaz de Stream: dropWhile, takeWhile, ofNullable. También hay una nueva sobrecarga del método de iteración, que le permite proporcionar un Predicado (condición de juicio) para especificar cuándo finalizar la iteración:

IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

El segundo parámetro es un Lambda, que devolverá verdadero cuando el elemento en el IntStream actual alcance 100. Entonces, este simple ejemplo es imprimir 1 a 99 en la consola.

Además de la extensión de Stream en sí, también se ha mejorado la combinación entre Optional y Stream. Ahora puede convertir un objeto opcional en un objeto Stream (posiblemente vacío) a través del nuevo método opcional stram:

Stream<Integer> s = Optional.of(1).stream();

Convertir Opcional en Stream es muy útil cuando se combinan canalizaciones de Stream complejas.

7. Método de interfaz privada

Java 8 nos trae el método predeterminado de la interfaz. Las interfaces ahora también pueden contener comportamientos en lugar de solo firmas de métodos. Sin embargo, ¿qué sucede si hay varios métodos predeterminados en la interfaz y el código es casi el mismo? Por lo general, refactorizará estos métodos y llamará a un método privado reutilizable. Pero el método predeterminado no puede ser privado. La creación de código reutilizado como método predeterminado no es una solución, porque el método auxiliar pasará a formar parte de la API pública. Con Java 9, puede agregar métodos auxiliares privados a la interfaz para resolver este problema:

public interface MyInterface {

    void normalInterfaceMethod();

    default void interfaceMethodWithDefault() {  init(); }

    default void anotherDefaultMethod() { init(); }

    // This method is not part of the public API exposed by MyInterface
    private void init() { System.out.println("Initializing"); }
}

Si desarrolla una API utilizando métodos predeterminados, los métodos de interfaz privada pueden ayudar a construir su implementación.

8 、 HTTP / 2

Hay nuevas formas de manejar llamadas HTTP en Java 9. Esta última función se utiliza para reemplazar la antigua API de HttpURLConnection y proporcionar soporte para WebSocket y HTTP / 2. Nota: La nueva API de HttpClient se entrega como un módulo incubador en Java 9. En otras palabras, esta API no puede garantizar el 100% de finalización. Pero puede comenzar a usar esta API en Java 9:

HttpClient client = HttpClient.newHttpClient();

HttpRequest req =
   HttpRequest.newBuilder(URI.create("http://www.google.com"))
              .header("User-Agent","Java")
              .GET()
              .build();

HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

Además de este modelo simple de solicitud / respuesta, HttpClient también proporciona nuevas API para manejar las características HTTP / 2, como la transmisión y la inserción en el lado del servidor.

9. JAR compatible con múltiples versiones

La última característica en la que nos centraremos es una buena noticia para los encargados de mantenimiento de bibliotecas. Cuando aparece una nueva versión de Java, los usuarios de su biblioteca tardarán años en cambiar a esta nueva versión. Esto significa que la biblioteca debe ser compatible con la versión más antigua de Java que desea admitir (en muchos casos, Java 6 o 7). En realidad, esto significa que durante mucho tiempo en el futuro, no podrá utilizar las nuevas funciones proporcionadas por Java 9 en la biblioteca. Afortunadamente, la función JAR compatible con múltiples versiones le permite crear una versión de clase que puede elegir usar solo cuando ejecuta un programa de biblioteca en una versión específica del entorno Java:

multirelease.jar
├── META-INF
│   └── versions
│       └── 9
│           └── multirelease
│               └── Helper.class
├── multirelease
    ├── Helper.class
    └── Main.class

En el escenario anterior, multirelease.jar se puede utilizar en Java 9, pero la clase Helper no utiliza la clase multirelease.Helper de nivel superior, sino la que se encuentra en "META-INF / versions / 9".

Esta es una versión de clase especialmente preparada para Java 9, que puede utilizar las funciones y bibliotecas proporcionadas por Java 9. Al mismo tiempo, el uso de este JAR en versiones anteriores de Java también se puede ejecutar, porque las versiones anteriores de Java solo verán la clase auxiliar en el nivel superior.

Como puede ver, Java 9 ofrece muchas funciones, grandes o pequeñas, ¿está listo?

Original: https://www.pluralsight.com/blog/software-development/java-9-new-features
Traducción: Tocy, LeoXu, Chief, Border Town,
Xibian Nine Festivals Traducción: www.oschina.net/translate/java -9-nuevas-funciones

Supongo que te gusta

Origin blog.csdn.net/qq_21383435/article/details/108496915
Recomendado
Clasificación