Despois de seis meses de desenvolvemento, Oracle liberado plataforma JavaSE 14 (Java Platform, Standard Edition 14), o proxecto OpenJDK de código aberto úsase como implementación de referencia. Java SE 14 mantén a compatibilidade con versións anteriores da plataforma Java; todos os proxectos Java escritos anteriormente funcionarán sen cambios cando se executen baixo a nova versión. Compilacións Java SE 14 listas para instalar (JDK, JRE e Server JRE) preparado para Linux (x86_64), Windows e macOS. Implementación de referencia desenvolvida polo proxecto OpenJDK Java 14 é de código aberto totalmente baixo a licenza GPLv2, con excepcións de GNU ClassPath que permiten conexións dinámicas con produtos comerciais.
Java SE 14 está clasificado como versión de soporte xeral e seguirá recibindo actualizacións ata a próxima versión. A rama de Soporte a longo prazo (LTS) debería ser Java SE 11, que seguirá recibindo actualizacións ata 2026. A anterior rama LTS de Java 8 será compatible ata decembro de 2020. O próximo lanzamento de LTS está programado para setembro de 2021. Lembrámosvos que a partir do lanzamento de Java 10, o proxecto pasou a un novo proceso de desenvolvemento, o que implica un ciclo máis curto para a formación de novos lanzamentos. Agora desenvólvese unha nova funcionalidade nunha rama mestra que se actualiza constantemente, que inclúe cambios xa feitos e da que se ramifican cada seis meses para estabilizar as novas versións.
Engadido soporte experimental coincidencia de patróns no operador "instanceof", que permite definir inmediatamente unha variable local para acceder ao valor marcado. Por exemplo, pode escribir inmediatamente "se (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}" sen definir explícitamente "String s = (String) obj".
Foi:
if (obj instancia do grupo) {
Grupo grupo = (Grupo) obj;
entradas var = group.getEntries();
}
Agora podes prescindir da definición "Group group = (Group) obj":
if (obj instanceof Group Group) {
entradas var = group.getEntries();
}
Engadiuse soporte experimental para a nova palabra clave "rexistro", que proporciona unha forma compacta para definir clases, o que lle permite evitar definir explícitamente varios métodos de baixo nivel como equals(), hashCode() e toString() nos casos en que os datos se almacenan só en campos cuxo comportamento non cambia. Cando unha clase usa implementacións estándar dos métodos equals(), hashCode() e toString(), pode prescindir da súa definición explícita:
rexistro público Transacción bancaria (data LocalDate,
dobre cantidade
Descrición da cadea) {}
Esta declaración engadirá automaticamente implementacións dos métodos equals(), hashCode() e toString() ademais dos métodos construtor e getter.
Normalizado e o soporte para unha nova forma de expresións "cambiar" está habilitado de forma predeterminada, que non require especificar o operador de "interrupción", permítelle combinar etiquetas repetidas e pódese usar non só en forma de operador, senón tamén como operador. expresión.
var log = cambiar (evento) {
case PLAY -> "O usuario activou o botón de reprodución";
caso STOP, PAUSE -> "O usuario necesita un descanso";
predeterminado -> {
String message = event.toString();
LocalDateTime agora = LocalDateTime.now();
produce "Evento descoñecido" + mensaxe +
» iniciado sesión » + agora;
}
};
Soporte experimental ampliado bloques de texto — unha nova forma de literais de cadea que lle permite incluír datos de texto de varias liñas no código fonte sen usar escape de caracteres e conservando o formato orixinal do texto no bloque. O bloque está enmarcado por tres comiñas dobres. En Java 14, os bloques de texto agora admiten a secuencia de escape "\s" para definir un único espazo e "\" para concatenar coa seguinte liña (ignorando as novas liñas cando precisa imprimir unha liña moi longa). Por exemplo, no canto de código
String html = " » +
"\n\t" + " » +
"\n\t\t" + " \"Java 1 xa está aquí\" » +
"\n\t" + " » +
"\n" + " ";
podes especificar:
String html = """
»Java 1\
é aquí!
""";
Ampliouse o contido informativo dos diagnósticos cando se producen excepcións NullPointerException. Mentres que antes a mensaxe de erro só se refería ao número de liña, agora detalla cal é o método que provocou a excepción. Actualmente, os diagnósticos avanzados só están habilitados cando se inician coa marca "-XX:+ShowCodeDetailsInExceptionMessages". Por exemplo, ao especificar esta marca, a excepción na liña
var nome = usuario.getLocation().getCity().getName();
dará lugar a unha mensaxe
Excepción no fío "main" java.lang.NullPointerException: non se pode invocar "Location.getCity()"
porque o valor de retorno de "User.getLocation()" é nulo
en NullPointerExample.main(NullPointerExample.java:5):5)
o que deixa claro que o método Location.getCity() non foi chamado e User.getLocation() devolveu nulo.
Implementado Unha vista previa da utilidade jpackage, que lle permite crear paquetes para aplicacións Java autónomas. A utilidade baséase en javapackager de JavaFX e permite crear paquetes en formatos propios de varias plataformas (msi e exe para Windows, pkg e dmg para macOS, deb e rpm para Linux). Os paquetes inclúen todas as dependencias necesarias.
Ao lixo G1 engadido un novo mecanismo de asignación de memoria que ten en conta as particularidades de traballar en grandes sistemas usando a arquitectura EN. O novo asignador de memoria está habilitado mediante a marca "+XX:+UseNUMA" e pode mellorar significativamente o rendemento nos sistemas NUMA.
Engadido API para a monitorización en tempo real de eventos JFR (JDK Flight Recorder), por exemplo para organizar un seguimento continuo.
Engadido jdk.nio.mapmode, que ofrece novos modos (READ_ONLY_SYNC, WRITE_ONLY_SYNC) para crear búferes de bytes mapeados (MappedByteBuffer) facendo referencia á memoria non volátil (NVM).
Implementado Unha vista previa da API de acceso á memoria estranxeira, que permite ás aplicacións Java acceder de forma segura e eficiente a rexións de memoria fóra do montón de Java manipulando as novas abstraccións MemorySegment, MemoryAddress e MemoryLayout.
Anunciado portos obsoletos para os procesadores Solaris OS e SPARC (Solaris/SPARC, Solaris/x64 e Linux/SPARC) coa intención de eliminar estes portos no futuro. O abandono destes portos permitirá á comunidade acelerar o desenvolvemento de novas funcións OpenJDK sen perder tempo en manter as funcións específicas de Solaris e SPARC.
Eliminado o colector de lixo CMS (Concurrent Mark Sweep), que foi marcado como obsoleto hai dous anos e permaneceu sen mantemento (CMS foi substituído hai moito tempo polo colector de lixo G1). Ademais, anunciou desaprobou o uso dunha combinación de algoritmos de recollida de lixo ParallelScavenge e SerialOld (execútase coas opcións "-XX:+UseParallelGC -XX:-UseParallelOldGC").
Proporcionouse soporte experimental para o colector de lixo ZGC (Z Garbage Collector) en plataformas macOS e Windows (anteriormente só admitía Linux). ZGC funciona en modo pasivo, minimiza a latencia debido á recollida de lixo na medida do posible (o tempo de parada cando se usa ZGC non supera os 10 ms.) e pode funcionar tanto con montóns pequenos como enormes, que van desde varios centos de megabytes ata moitos terabytes.
Eliminado Toolkit e API para comprimir ficheiros JAR usando o algoritmo Pack200.