No nos hemos sumergido completamente en Java 10 aún, y ya está aquí Java 11. Java 11 es importante por más que solo algunas razones. Oracle ha renovado su modelo de soporte y ha creado un tren de lanzamiento que traerá actualizaciones rápidas, aproximadamente cada 6 meses. Han cambiado el modelo de licencia y soporte, lo que significa que si descargas el JDK de Oracle Java 11, será de pago para uso comercial.
¿Eso significa que debo pagar por Java a partir de ahora? NO. No necesariamente a menos que descargues el JDK de Oracle y lo uses en producción.
Nota: IntelliJ IDEA 2018.2.4 Community Edition ya tiene soporte para Java 11.
1. ¿Por qué es importante Java 11?
Java 11 es la segunda versión LTS después de Java 8. Desde Java 11, el JDK de Oracle ya no será gratuito para uso comercial. Puedes usarlo en etapas de desarrollo, pero para usarlo comercialmente, necesitas comprar una licencia. ¡Si no lo haces, puedes recibir una factura de Oracle en cualquier momento! Java 10 fue el último JDK de Oracle gratuito que se podía descargar. Oracle deja de dar soporte a Java 8 desde enero de 2019. Tendrás que pagar por más soporte. Puedes seguir usándolo, pero no recibirás parches/actualizaciones de seguridad.
Oracle no proporcionará soporte gratuito a largo plazo (LTS) para ninguna versión individual de Java desde Java 11.
Si bien Oracle JDK ya no es gratuito, siempre puedes descargar las versiones de OpenJDK de Oracle u otros proveedores como AdoptOpenJDK, Azul, IBM, Red Hat, etc. En mi opinión, a menos que estés buscando un uso a nivel empresarial con la disposición de pagar por las tarifas de soporte, puedes utilizar OpenJDK y actualizarlo según sea necesario.
2. ¿Qué versión de JDK debería descargar y cuáles son los beneficios de cada una?
Dado que Oracle ha creado un tren de lanzamiento en el cual una nueva versión aparecería cada seis meses, si estás utilizando la versión gratuita de OpenJDK de Oracle, deberás actualizarla cada seis meses, ya que Oracle no proporcionará actualizaciones gratuitas una vez que se lance la nueva versión. Esto puede ser un desafío para adaptarse en una empresa. Paga por el soporte comercial a Oracle y migra solo de una versión LTS a la siguiente versión LTS. De esta manera, obtendrás todas las actualizaciones y el soporte para Java 11 hasta 2026. Puedes descargar Java 17 en 2022. Quédate en la versión gratuita de Java incluso después de que termine su soporte. Aunque no obtendrás actualizaciones de seguridad y puede abrir brechas de seguridad.
Oracle no proporcionará soporte comercial ni actualizaciones para Java 9 y Java 10. Debes buscar otras versiones alternativas para seguir utilizándolas de forma gratuita.
Habiendo entendido el bagaje que viene con Java 11, vamos a analizar ahora las características importantes en Java 11 para los desarrolladores. También discutiremos algunos JEPs importantes. Nota: JavaFX estará disponible como un módulo separado y no estará atado al ciclo de lanzamiento de 6 meses de Java JDK.
3. ¿Cómo descargar la versión gratuita de Java 11?
Puedes descargar la versión lista para producción de OpenJDK desde este enlace. Los binarios están en formato tar o zip, así que simplemente descomprímelos y configura las variables de entorno para usar el compilador de java y los comandos de java.
4. Características de Java 11
Algunas de las características importantes de Java 11 son:
- Ejecución de archivo Java con un solo comando
- Nuevos métodos de utilidad en la clase String
- Sintaxis de Variable Local para Parámetros Lambda
- Control de Acceso Basado en Anidamiento
- JEP 321: Cliente HTTP
- Lectura/Escritura de Cadenas desde/hacia Archivos
- JEP 328: Grabador de Vuelo
Discutamos las nuevas características introducidas con Java 11 desde el Proceso JEP.
4.1) Ejecución de archivo Java con un solo comando
Un cambio importante es que no necesitas compilar primero el archivo fuente Java con la herramienta javac
. Puedes ejecutar directamente el archivo con el comando java y se compila implícitamente. Esta función está bajo JEP 330. A continuación, se muestra un vistazo a los nuevos métodos de la clase Java String introducidos en Java 11:
4.2) Métodos de String en Java
isBlank() – Este método de instancia devuelve un valor booleano. Las cadenas vacías y las cadenas con solo espacios en blanco se consideran en blanco.
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// Tu código aquí!
System.out.println(" ".isBlank()); //true
String s = "Anupam";
System.out.println(s.isBlank()); //false
String s1 = "";
System.out.println(s1.isBlank()); //true
}
}
lines() Este método devuelve un flujo de cadenas, que es una colección de todas las subcadenas divididas por líneas.
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws Exception {
String str = "JD\nJD\nJD";
System.out.println(str);
System.out.println(str.lines().collect(Collectors.toList()));
}
}
El resultado del código anterior es: strip(), stripLeading(), stripTrailing()
strip()
– Elimina los espacios en blanco del principio y del final de la cadena.
Pero ya tenemos trim(). ¿Entonces para qué necesitamos strip()? strip()
es una evolución “consciente de Unicode” de trim()
. Cuando se introdujo trim()
, Unicode no estaba evolucionado. Ahora, el nuevo strip() elimina todos los tipos de espacios en blanco al principio y al final (compruebe el método Character.isWhitespace(c)
para saber si un unicode es un espacio en blanco o no)
Se proporciona un ejemplo que utiliza los tres métodos anteriores:
public class Main {
public static void main(String[] args) throws Exception {
// Tu código aquí!
String str = " JD ";
System.out.print("Start");
System.out.print(str.strip());
System.out.println("End");
System.out.print("Start");
System.out.print(str.stripLeading());
System.out.println("End");
System.out.print("Start");
System.out.print(str.stripTrailing());
System.out.println("End");
}
}
La salida en la consola del código anterior es: repeat(int) El método repeat simplemente repite la cadena tantas veces como se menciona en el método en forma de un entero.
public class Main {
public static void main(String[] args) throws Exception {
// Tu código aquí!
String str = "=".repeat(2);
System.out.println(str); //prints ==
}
}
4.3) Sintaxis de variable local para parámetros lambda
JEP 323, Sintaxis de Variables Locales para Parámetros de Lambda es la única característica de lenguaje lanzada en Java 11. En Java 10, se introdujo la Inferencia de Tipo de Variable Local. Por lo tanto, podíamos inferir el tipo de la variable desde el RHS – var list = new ArrayList<String>();
JEP 323 permite que var
se utilice para declarar los parámetros formales de una expresión lambda de tipo implícito. Ahora podemos definir:
(var s1, var s2) -> s1 + s2
Esto también era posible en Java 8 pero se eliminó en Java 10. Ahora vuelve en Java 11 para mantener las cosas uniformes. ¿Pero por qué es necesario esto cuando podemos simplemente omitir el tipo en la lambda? Si necesitas aplicar una anotación como @Nullable, no puedes hacerlo sin definir el tipo. Limitación de esta característica – Debes especificar el tipo var en todos los parámetros o ninguno. Cosas como las siguientes no son posibles:
(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed
var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.
4.4) Control de Acceso Basado en Anidamiento
Antes de Java 11 esto era posible:
public class Main {
public void myPublic() {
}
private void myPrivate() {
}
class Nested {
public void nestedPublic() {
myPrivate();
}
}
}
el método privado de la clase principal es accesible desde la clase anidada anterior de la manera anterior. Pero si usamos Reflexión en Java, lanzará una IllegalStateException
.
Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);
El control de acceso anidado de Java 11 aborda esta preocupación en la reflexión. La clase java.lang.Class
introduce tres métodos en la API de reflexión: getNestHost()
, getNestMembers()
y isNestmateOf()
.
4.5) JEP 309: Constantes de Archivo de Clase Dinámicas
El formato de archivo de clase de Java ahora extiende el soporte a una nueva forma de pool de constantes, CONSTANT_Dynamic. El objetivo de esta JEP es reducir el costo y la interrupción del desarrollo de nuevas formas de restricciones materializables de archivos de clase, creando una única nueva forma de pool de constantes que puede ser parametrizada con comportamiento proporcionado por el usuario. Esto mejora el rendimiento
4.6) JEP 318: Epsilon: Un Recolector de Basura Inactivo
A diferencia del GC de la JVM que es responsable de asignar memoria y liberarla, Epsilon solo asigna memoria. Asigna memoria para las siguientes cosas:
- Pruebas de rendimiento.
- Pruebas de presión de memoria.
- Pruebas de interfaz de VM.
- Trabajos extremadamente cortos en duración.
- Mejoras en la latencia de última instancia.
- Mejoras en el rendimiento de última instancia.
Ahora Elipson solo es bueno para entornos de prueba. Esto llevará a un OutOfMemoryError en producción y hará que las aplicaciones se bloqueen. El beneficio de Elipson es que no hay sobrecarga de limpieza de memoria. Por lo tanto, dará un resultado de prueba preciso del rendimiento y ya no podemos realizar GC para detenerlo. Nota: Esta es una característica experimental.
4.7) JEP 320: Eliminar los módulos Java EE y CORBA
Los módulos ya fueron deprecados en Java 9. Ahora se han eliminado por completo. Los siguientes paquetes se eliminaron: java.xml.ws
, java.xml.bind
, java.activation
, java.xml.ws.annotation
, java.corba
, java.transaction
, java.se.ee
, jdk.xml.ws
, jdk.xml.bind
4.8) JEP 328: Grabador de vuelo
El Grabador de Vuelo, que antes solía ser un complemento comercial en Oracle JDK, ahora es de código abierto ya que Oracle JDK ya no es gratuito. JFR es una herramienta de perfilado utilizada para recopilar datos de diagnóstico y perfilado de una aplicación Java en ejecución. Su sobrecarga de rendimiento es insignificante y suele ser inferior al 1%. Por lo tanto, puede ser utilizado en aplicaciones de producción.
4.9) JEP 321: Cliente HTTP
Java 11 estandariza la API del Cliente HTTP. La nueva API admite tanto HTTP/1.1 como HTTP/2. Está diseñada para mejorar el rendimiento general del envío de solicitudes por parte de un cliente y la recepción de respuestas del servidor. También admite nativamente WebSockets.
4.10) Lectura/Escritura de Cadenas desde y hacia los Archivos
Java 11 se esfuerza por hacer la lectura y escritura de cadenas conveniente. Ha introducido los siguientes métodos para leer y escribir desde/hacia los archivos:
- readString()
- writeString()
El siguiente código muestra un ejemplo de esto.
Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD
4.11) JEP 329: Algoritmos Criptográficos ChaCha20 y Poly1305
Java 11 proporciona implementaciones de cifrado ChaCha20 y ChaCha20-Poly1305. Estos algoritmos se implementarán en el proveedor SunJCE.
4.12) JEP 315: Mejora de Intrínsecos Aarch64
Mejora los intrínsecos existentes de cadena y matriz, e implementa nuevos intrínsecos para las funciones sin, cos y log de java.lang.Math, en procesadores AArch64.
4.13) JEP 333: ZGC: Un Recolector de Basura Escalable de Baja Latencia (Experimental)
Java 11 ha introducido un GC de baja latencia. Esta es una característica experimental. Es bueno ver que Oracle está dando importancia a los GC.
4.14) JEP 335: Depreciar el Motor de JavaScript Nashorn
El motor de script JavaScript Nashorn y sus APIs están obsoletos, lo que indica que serán eliminados en las próximas versiones.
5. Conclusión
Hemos repasado las características importantes y las actualizaciones proporcionadas en Java 11. Nos vemos pronto cuando se lance Java 12.
Source:
https://www.digitalocean.com/community/tutorials/java-11-features