Novedades de Java 12

Escrito por el .
java planeta-codigo
Comentarios

Java

El 19 de marzo del 2019 se publicaba la versión Java 12 siguiendo el calendario de lanzar una nueva versión cada seis meses incorporando nuevas funcionalidades de forma incremental. La versión 12 no es una versión con soporte extendido y dejará de tener actualizaciones cuando se publique la siguiente versión. La primera versión LTS con la funcionalidad de módulos es la 11 y la recomendada para proyectos de larga duración o bajo mantenimiento, la siguiente LTS será la versión 17 que según lo planificado se publicará en septiembre de 2021 después de tres años.

Las características destacadas de Java 12 son la incorporación de forma experimental las expresiones switch y mejoras en el recolector de basura para mayor rendimiento.

Las mejoras incluídas en esta versión son:

Expresiones switch

Las expresiones switch permiten quitar varias sentencias if else encadenadas. Cada rama de la sentencia siwtch devuelve un valor y no hace falta usar la sentencia break, se pueden utilizar varios casos para cada rama.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

String numericString = switch (integer) {  
    case 0 -> "zero";  
    case 1, 3, 5, 7, 9 -> "odd";  
    case 2, 4, 6, 8, 10 -> "even";  
    default -> "N/A";  
};

Teeing Collectors

Los stream proporcionan un flujo de elementos a procesar. En el caso de querer recolectar dos valores de ese flujo requiere usar un reduce que complica el código. Se ha añadido un nuevo colector Collectors.teeing() para enviar un elemento de un stream a dos streams, de forma similar a lo que hace el comando tee en Unix.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Range<String> range = Stream
    .of(1, 8, 2, 5)
    .collect(Collectors.teeing(
        // the collectors produce Optional<Integer>
        Collectors.minBy(Integer::compareTo),
        Collectors.maxBy(Integer::compareTo),
        // I wrote a static factory method that creates
        // a range from two Optional<Integer>
        Range::ofOptional))
    .orElseThrow(() -> new IllegalStateException(
        "Non-empty stream was empty."));

Formato de número compacto

Ahr se puede expresar un número de forma compacta con la clase CompactNumberFormat o el método NumberFormat.getCompactNumberInstance().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
NumberFormat followers = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
followers.setMaximumFractionDigits(1);
System.out.println(followers.format(5412) + " followers");

// Resultado: 5.4K followers

NumberFormat number = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
System.out.println(number.format(1000)); 

// Resultado: 1K

Recolector de basura Shenandoah

Una de la áreas que más atención reciben para mejorar el rendimiento de las aplicaciones es el recolector de basura. Shenandoah es uno nuevo que independiente del tamaño de la memoria, ya sea de 200 MiB o 200 GiB, el tiempo de las pausas es el mismo. También se han implementado mejoras en el recolector de basura G1 actual.

Otras

Algunos métodos han sido eliminados varios relacionados con el método finalize cuyo uso está desaconsejado desde hace mucho tiempo por no se una forma segura de liberar recursos. Algunos algoritmos de cifrado inseguros han sido deshabilitados. Se ha añadido soporte para Unicode 11.0.0 con nuevos caracteres, bloques y scripts.