Top 6 nuevas características de Java 14

0
3309

Índice de contenidos

 

Introducción

Java 14 (Java SE 14) y su código abierto Java Development Kit 14 (JDK 14) se lanzó el 17 de marzo de 2020. Esta versión nos trae algunas nuevas características de lenguaje interesantes (algunas de ellas en versión preliminar) junto con múltiples actualizaciones de la API de Java y mejoras generales de JVM. En este tutorial, veremos mi top 6 de características y mejoras junto con algunos ejemplos de código. ¡Vamos al grano!
 

NPE fatigue

¿Estás cansado de rastrear excepciones de null pointer y depurar para ver qué está sucediendo exactamente? ¡Pues ya no más! Java 14 ha introducido «Helpful null pointer exceptions». Dado que los NPE pueden ocurrir casi en cualquier parte de un programa, no es práctico intentar controlar este tipo de errores con un try catch y posteriormente seguir con el flujo del programa ya que se tratan de excepciones de tipo no verificadas (unchecked en inglés). Como resultado, los desarrolladores confían en la JVM para identificar la fuente de un NPE cuando realmente ocurre. Por ejemplo, supongamos que ocurre un NPE en este código:

public void produceNullPointer(){
      String a = null;
      String b = a.toLowerCase();
}

En versiones previas a Java 14, el mensaje de error que aparecía en consola era el nombre de la clase y la línea donde se produjo el null pointer:
Exception in thread "main" java.lang.NullPointerException
at NullPointersExample.produceNullPointer(NullPointersExample.java:7)
at Main.main(Main.java:5)

El uso de Java 14 nos permitirá recibir el siguiente resultado que nos ayudará a saber por segundo exactamente de donde viene el null pointer;
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because "a" is null
at NullPointersExample.produceNullPointer(NullPointersExample.java:7)
at Main.main(Main.java:5)

Para habilitar los mensajes informativos de excepción, debe agregar la opción VM:
-XX:+ShowCodeDetailsInExceptionMessages

Aviso: Sin embargo, debemos tener en cuenta que existen algunos riesgos. El mensaje de detalles nulos puede contener nombres de variables del código fuente. Exponer este tipo de información podría considerarse un riesgo de seguridad.

 

Records (preview)

Los registros son similares a las clases de datos en Kotlin. Básicamente son versiones restringidas y mejoradas de las clases POJO normales en Java. Si desea escribir una clase POJO en Java, necesita implementar constructores, equalsHashCode, toString, getters, setters, etc. Normalmente, como muchos de nosotros, usamos Lombok para ayudarnos con la tarea y evitar el código duplicado.
Pero ahora hay una forma nativa de hacerlo sin necesidad de añadir dependencias externas -> Implementación de un Java Record. Todo lo que necesitamos hacer es declarar el tipo como registro y declarar los campos como argumentos.

public record EmployeeRecord(String firstName, String lastName, Integer age, BigDecimal salary){}

La diferencia ahora es cómo se accede al campo. Ahora, en vez de usar getters simplemente lo hacemos usando el nombre del campo. Ejemplo:

EmployeeRecord employeeRecord = new EmployeeRecord("John","Doe",26,BigDecimal.valueOf(80000));

employeeRecord.firstName(); // acceder el nombre del empleado
employeeRecord.salary(); // acceder el salario del empleado

 

Enchanced Switch Expressions (standard)

Java 14 tiene una declaración de cambio extendida, que puede usarse como una expresión con la ayuda de la función lambda (->), y ahora puede generar / devolver el valor. Esta fue una función de idioma de vista previa en JDK 13.

Antes de Java 14 necesitábamos implementar expresiones de cambio como esta:

public void determineBestRole() {
     String movie = "Lord Of The Rings";
     String bestRole = "";
     switch (movie) {
         case "Lord Of The Rings":
             bestRole = "Frodo";
             break;
         case "Lord Of The Rings 2":
             bestRole = "Aragorn";
             break;
         case "Lord Of The Rings 3":
             bestRole = "Sam";
             break;
      }
        System.out.println(bestRole);
}

Ahora java 14 nos permite la siguiente solución:

public void determineBestRole(){
  String movie = "Lord Of The Rings";
  String bestRole = switch (movie){
      case "Lord Of The Rings" -> "Frodo";
      case "Lord Of The Rings 2" -> "Aragorn";
      case "Lord Of The Rings 3" -> {
            // mas acciones
            yield "Sam";
          }
      default -> throw new IllegalStateException("Unexpected value: " + movie);
    };
      System.out.println(bestRole);
  }
}

Tal como vemos, el uso de expresiones de conmutación se simplifica e incluso podemos ejecutar más líneas de código en diferentes casos. Si queremos realizar más acciones en una expresión, es obligatorio utilizar la palabra clave yield para devolver el valor del caso.
 

Pattern Matching for instanceof (preview)

Normalmente, cuando tratamos con el tipo Object del paquete java.Lang, muchas veces necesitamos convertirlo al tipo requerido al verificar primero su tipo. Antes de Java 14, se hacía así

public void foo() {
      Object obj = "String object";
      if (obj instanceof String) {
          String str = (String) obj;
          System.out.println(str.toLowerCase());
      }
}

Usando java 14 podemos hacerlo sin emitir explícitamente el objeto, solo tenemos que proporcionar el nombre de la variable correspondiente y listo.

public void foo(){
   Object obj = "String object";
   if(obj instanceof String str){
       System.out.println(str.toLowerCase());
   }
}

 

Packaging Tool (Incubator)

Es una herramienta de empaquetado, diseñada para facilitar el proceso de instalación, que depende de varias dependencias. A veces no es suficiente proporcionar un solo archivo JAR. Se debe proporcionar un kit instalable apropiado para el local / nativo. Una herramienta de empaque también puede ayudar a llenar los vacíos que dejan otras tecnologías.

La herramienta jpackage agrupa una aplicación Java en un paquete específico de plataforma que contiene todas las dependencias requeridas. Como un conjunto de archivos JAR ordinarios o como una colección de módulos. Los formatos de paquete específicos de plataforma compatibles son:

    • Linux: deb y rpm
    • macOS: pkg y dmg
    • Windows: msi y exe

 

Second Preview Of Text Blocks

Todos sabemos que introducir cadenas HTML, JS o SQL en Java, a veces puede ser difícil de lograr, difícil de leer y mantener. Es por eso que podemos hacer un buen uso de los bloques de texto. Con Text Blocks, podemos declarar cadenas de líneas múltiples en Java sin la necesidad de concatenar cada línea de la cadena.
La característica se introdujo originalmente en Java 13 como primera vista previa. Teniendo en cuenta que dado que Java 13 no es un LTS release (no hay muchas personas migradas a él) mostraré la diferencia de Java sin Text Blocks (versiónes < 13) de texto y Java 14 (segunda vista previa de text blocks).

Antes de Java 14:

String beforeJava13And14 = "<html>\n" +
              "<body>\n" +
              "   <p>Hello World</p>\n" +
              "</body>\n" +
              "</html>";

Después Java 14:

Con los bloques de texto, podemos simplemente poner nuestro texto entre comillas triples y la interpretación de la cadena será preservada por Java. Tenga en cuenta que en la segunda vista previa ahora podemos agregar una barra diagonal al final de cualquier línea dentro de la cadena de varias líneas, para ignorar el próximo salto de línea

String java14 = """
                   <html>
                     <body>\
                       <p>Hello '\s' Java 14</p>
                     </body>
                   </html>
                """;

Imprimir el valor de la String java14 producirá el siguiente resultado

text-blocks-java-14
 

Conclusión

Así que esas fueron mis 6 características principales en el nuevo Java 14.
Teniendo en cuenta que estas características no afectarán al trabajo diario de cada desarrollador, podemos decir que no se van a usar tanto. Quizás los más utilizados serían los Helpful Null Pointer Exceptions durante el estado de desarrollo, la Pattern matching for instanceof, y la Records.
Sin embargo, la Pattern matching for instanceof y los Records solo son unas features de vista previa y aún no deben utilizarse en un entorno de producción. Se espera el lanzamiento completo de esta función en java 15.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad