Java 14 se acerca



Según Oracle, el lanzamiento de Java 14 está programado para el 17 de marzo. Me pregunto si la fecha de lanzamiento está relacionada con el Día de San Patricio (que se celebra en este día) o no lo sabremos muy pronto. Echemos un vistazo a las innovaciones que estarán disponibles en el nuevo Java y decidamos si beberemos cerveza de alegría o de tristeza.

Registros


Una función de lenguaje fundamentalmente nueva, disponible en modo de vista previa en Java 14. El objetivo principal es deshacerse de una gran cantidad de fideos en el código. Los registros deben reemplazar las clases que se usan solo para almacenar datos en campos sin ningún comportamiento descrito. Defina Record , y el compilador mismo generará los métodos constructor, getters, equals () y hashCode (), toString (). En algún lugar ya lo vimos, ¿verdad, señor Lombok? La entrada es la siguiente:

public record Person(String name, int age){}

Para compilar Record, debe descargar jdk14 e ingresar el siguiente comando:

javac —enable-preview —release 14 Person.java

Descompilamos y vemos lo que hizo el compilador:

public final class Person extends java.lang.Record {
    private final java.lang.String name;
    private final int age;

    public Person(java.lang.String name, int age) { /* compiled code */ }

    public java.lang.String toString() { /* compiled code */ }

    public final int hashCode() { /* compiled code */ }

    public final boolean equals(java.lang.Object o) { /* compiled code */ }

    public java.lang.String name() { /* compiled code */ }

    public int age() { /* compiled code */ }
}

Entonces, en lugar de Record, tenemos una clase final que hereda de la nueva clase abstracta de Record . Y como se esperaba, obtuvimos los getters generados, constructor, equals (), hashCode (), toString () . Tenga en cuenta que todos los campos están marcados como finales , lo que significa que no podemos redefinirlos, sin embargo, el registro en sí no se modifica por completo, porque Los objetos almacenados en los campos pueden ser mutables. Una discusión detallada de Record se puede encontrar aquí .

Talkative NullPointerExceptions


Más amigable será NullPointerExceptions . No, el compilador aún no sabe cómo arreglar NPE para nosotros, pero ahora la descripción de la excepción será más informativa. Simulamos la situación: llamamos NPE en Java 11 y Java 14. Por ejemplo, tenemos una composición compleja, típica de Entity , y para obtener los datos, necesitamos llamar a varios objetos desde la fuente para llegar al campo deseado, y así:

var street = message.getAuthor().getAddress().getStreet();

En Java 11, obtenemos un antiguo registro de error familiar que deja la pregunta principal: ¿Quién es nulo? Mensaje, autor, dirección?

Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:11)

Para ejecutar en Java 14, debe compilar la clase de la misma manera que el Registro anterior:

javac —enable-preview —release 14 Main.java

Y ejecutar agregando una bandera especial:

java -XX:+ShowCodeDetailsInExceptionMessages --enable-preview Main

Como resultado de la ejecución, obtenemos el siguiente resultado:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "Author.getAddress()" is null
	at Main.main(Main.java:11)

Como podemos ver, el mensaje se ha vuelto más informativo, y podemos ver exactamente dónde ocurrió la cadena de llamadas NPE .

Bloques de texto


Los bloques de texto introducidos en Java 13 también están disponibles en Java 14 como una función de vista previa. Permítame recordarle que su tarea principal es simplificar el trabajo con literales de varias líneas. Una característica muy conveniente para escribir consultas SQL, código HTML, JSON . Creo que esta es una de las características que serán muy útiles. Recordemos la sintaxis. Por ejemplo, necesitamos escribir una consulta SQL . Antes de Java 13, usaríamos la concatenación de cadenas para escribir una consulta legible, y la consulta se vería así:

String sql = "SELECT name, age " +
                 "FROM PERSON" +
                 "WHERE name = \'Igor\'" +
                 "AND car=\'Niva\'";

Comenzando con Java 13, podemos usar un bloque de texto escribiendo una línea entre comillas dobles triples como esta:


    String sql = """ 
                 SELECT name, age 
                 FROM PERSON
                 WHERE name = 'Igor'
                   AND car='Niva'
                 """;

Java 14 agrega dos nuevos delimitadores que pueden usarse en bloques de texto. El primero es un espacio único: \ s . El segundo es el carácter de nueva línea: \ .

Cambiar expresiones


Comenzando con Java 14, las expresiones de cambio se mueven de una función de vista previa a una función completa. Recordemos brevemente las características del nuevo operador:

  • Sintaxis Lambda
  • Capacidad para usar más de una expresión en un caso
  • Error de salida en caso de cobertura incompleta del conjunto de posibles valores de switch () . En otras palabras, si usa una enumeración:

    public enum  Car {
        NIVA, NEXIA, KIA
    }

    Luego, si escribe switch () de la siguiente manera, el compilador arrojará un error que dice que no se enumeran todos los casos posibles de la enumeración:

    switch (car) {
        case NIVA -> System.out.println("Niva");
        case NEXIA -> System.out.println("Nexia");
    }
    // error: the switch expressions does not cover all possible input values.

  • La capacidad de devolver un valor:

    var avto = switch (car) {
        case NIVA, KIA -> "Niva are better";
        case NEXIA -> "Nexia";
        default -> "Niva still better";
    };


La coincidencia de patrones


Pattern Matching es una nueva función de vista previa disponible en Java 14. Se ha hablado mucho sobre ello, muchos lo han estado esperando, y aquí está. El objetivo es combinar la comprobación del tipo de objeto y su conversión en la instancia del operador . En otras palabras, antes de Java 14 escribiríamos así:

Object obj = "Igor";

if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

Aquellos. Para utilizar los métodos de la clase que es el objeto, debe convertirlo en esta clase. A partir de Java 14, hay disponible una nueva sintaxis en la que instanciaof combina las funciones de validación y conversión:

Object obj = "Igor";

if (obj instanceof String s){
    System.out.println(s.length());
}

Conclusión


Java continúa evolucionando, haciendo la vida más fácil para los desarrolladores mortales comunes. Las nuevas características están diseñadas para hacer que el código sea más limpio, la vida más fácil y los salarios más altos. ¿Qué piensas, cuál de las nuevas características ganará el amor de la comunidad?

All Articles