Vamos rever muitas das mudanças mais importantes na plataforma Java que aconteceram entre a versão 8 (2014) e 18 (2022)
O Java 8 foi lançado em março de 2014 e o Java 18 em março de 2022. São 8 anos de progresso, 203 JEPs (JDK Enhancement Proposals ), entre essas duas versões. Neste post, revisaremos as mudanças mais importantes e discutiremos os benefícios e desafios da adoção de versões mais recentes do JDK para novos aplicativos e para os mais antigos compilados com versões mais antigas.
Desde a versão 9, o Java tem novos recursos a cada 6 meses e é muito difícil acompanhar essas novas mudanças. A maioria das informações na internet descreve as mudanças entre as duas últimas versões do Java. No entanto, se você estiver em uma situação semelhante à minha, não está usando uma das versões mais recentes do Java, mas uma das várias versões anteriores (Geralmente 8 ou 11 que são as versões de suporte estendido).
Então é útil saber quais novos recursos foram adicionados desde a versão que você usa agora, ou entre as versões que você usa agora e aquela que você deseja começar a usar em seguida. Portanto, compilei uma tabela com todos os novos recursos adicionados desde o Java 8 para cada nova versão do Java.
Abaixo você encontra tabelas para:
- Novos recursos da linguagem Java – adições à linguagem Java ou APIs
- Novas ferramentas e recursos no OpenJDK – adições fora da linguagem, como ferramentas de linha de comando ou melhorias na JVM
- Recursos e APIs obsoletos/removidos
Observe que não inclui todos os novos recursos e adições de API, apenas aqueles que são úteis para a maioria dos desenvolvedores, para manter a lista curta.
Este artigo não é sobre como escolher a versão Java certa para você usar. Mas vou pelo menos resumir todas as versões do Java desde o Java 8 e para sua conveniência:
- Java 8 – versão LTS (Long Term Support), última versão LTS antes do JPMS (módulos) serem introduzidos no Java 9
- Java 11 – versão LTS
- Java 17 – versão LTS, a versão LTS mais recente até março de 2023
- Java 18 – versão não LTS, a versão mais recente em março de 2022
- Todas as outras versões Java – versões não LTS
Na maioria dos casos, você deve usar apenas versões LTS em produção. Isso é, a menos que você tenha necessidades específicas para usar o maior e a mais recente versão e esteja disposto a atualizar para uma nova versão do Java a cada 6 meses. Para saber mais sobre as versões do Java LTS, você pode ler A arte do suporte de longo prazo e o que o LTS significa para o ecossistema Java da Oracle (Em Inglês).
Novos recursos da linguagem Java desde o Java 8
Feature |
Desde |
Preview desde |
Simple Web Server (a.k.a com.sun.net.httpserver.SimpleFileServer) Java API: SimpleFileServer.createFileServer(new InetSocketAddress(9000), path, logLevel).start(); Cmd Line: jwebserver -p 9000 |
18 |
|
Code Snippets in Java API Documentation {@snippet : lines of code} instead of <pre>{@code lines of code }</pre> |
18 |
|
UTF-8 by Default – em vez do charset definido pelo sistema.. Rode javac -encoding UTF-8 com JDK 8-17 para verificar problemas de codificação de código Java. |
18 |
|
Context-Specific Deserialization Filters – Permitir que os aplicativos configurem filtros de desserialização, especifique um padrão por meio de uma propriedade do sistema ou uma fábrica de filtros por meio de uma propriedade do sistema ou por meio de ObjectInputFilter.Config |
17 |
|
Pattern Matching for switch – como instanceof para switch; switch é uma expressão e pode ser atribuída: String result = switch (o) { case null -> null; case 0 -> throw new RuntimeException("Cannot be 0"); // Special cases case Integer i && i > 0 -> "Positive number"; case Integer i -> "Negative number"; // 0 and positive numbers handled by above rules case String s -> s; case Point p -> p.toString(); case int[] ia -> "Array length" + ia.length; default -> "Something else"; } |
17 |
|
Foreign Function & Memory API (uma alternativa ao JNI) |
16 |
|
Vector API – Cálculos expressos que compilam para instruções de hardware ideais |
16 |
|
Sealed classes (herança apenas para classes permitidas): public abstract sealed class Shape permits Circle, Rectangle, Square {...} |
17 |
15 |
Record type – classes de dados com métodos getters, construtores, equals, hashCode e toString implícitos: record Point(int x, int y) { } |
16 |
14 |
Membros estáticos em classes internas (parte do JEP Record type) new Object() { static record MyData(String data) {}; public static final int CONSTANT = 1; }; |
16 |
16 |
Pattern Matching for instanceof: if (x instanceOf String s) { String a = s; } |
16 |
14 |
String query = """ SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"; """ |
15 |
13 |
Novos métodos de String (formatted, stripIndent, translateEscapes) |
15 |
|
boolean isWeekend = switch (day) { case SATURDAY, SUNDAY -> true; default -> false; }; |
14 |
12 |
Novos métodos de String (indent, transform) |
12 |
|
12 |
||
Novos métodos de String (repeat, isBlank, strip, lines) |
11 |
|
var type allowed in Lambda Parameters: (@NonNull var x) -> process(x) |
11 |
|
11 |
9 |
|
TLS v1.3 – suporte para uma nova versão do protocolo SSL/TLS |
11 |
|
var type allowed for local variables: var length = str.length(); |
10 |
|
9 |
||
9 |
||
List.of(a, b, c); Set.of(d, e, f, g); Map.of(k1, v1, k2, v2); |
9 |
|
Stream API improvements (takeWhile, dropWhile, ofNullable, iterate with condition) |
9 |
|
9 |
||
9 |
||
Process API updates (informações detalhadas sobre processos, por ex. ID, onExit, destroy) |
9 |
|
new methods in CompletableFuture API (delay, timeout) |
9 |
|
9 |
||
9 |
||
8 |
||
8 |
||
8 |
||
8 |
||
8 |
||
8 |
||
8 |
||
8 |
||
8 |
New JDK tools and features since OpenJDK 8
Tool / feature |
Desde |
Preview desde |
14 |
||
11 |
||
Experimental Java-Based JIT Compiler (Graal VM) |
10 |
|
15 |
12 |
|
15 |
11 |
|
14 |
||
11 |
||
Flight recorder (data collection framework for troubleshooting) |
11 |
|
-XX:-UseContainerSupport |
10, 8u191 |
|
-XX:MaxRAMPercentage |
10, 8u191 |
|
10 |
||
jlink – custom JRE image, subset of JRE |
9 |
|
JShell (Java REPL) – run Java commands interactively |
9 |
|
9 |
||
9 |
Deprecated/removed features and APIs:
Feature / API |
Depreciado desde |
Removido desde |
Deprecate Finalization for Removal (finalize() and similar methods) |
18 |
|
17 |
||
Constructors of primitive wrapper classes (e.g. new Integer(1)) |
16 |
|
14 |
||
Applet API (Deprecated For Removal in Java 17) |
9 |
|
15 |
17 |
|
Strongly Encapsulate JDK Internals (except sun.misc.Unsafe and some more) – internal JDK classes won’t be available anymore |
9 |
17 |
11 |
15 |
|
14 |
15 |
|
CMS GC |
9 |
14 |
11 |
14 |
|
11 |
||
Java Web Start (was only in Oracle JDK) |
9 |
11 |
Java EE and CORBA modules (JAX-WS, JAXB, JAF, Common Annotations, CORBA, JTA) Look here to find replacements for the removed modules |
9 |
11 |
10 |
||
9 |
||
9 |
||
9 |
||
9 |
||
8 |
9 |
Para mais detalhes, o catálogo javaalmanac.io/ é muito útil para navegar pelas mudanças em Java ao longo de todo o seu histórico. Ele pode fornecer diferenças completas de APIs entre versões Java selecionadas, por exemplo, entre Java 8 e Java 11. Muito útil se você está pensando em migrar para uma versão específica do Java.
Fontes (Em Inglês):
A categorized list of all Java and JVM features since JDK 8 to 18 - Advanced Web Machinery
Java 8 to 18: most important changes in the java platform
New features between Java 8 and Java 18 - .Lost in Coding
Obrigado pelo conteúdo. Ajudou bastante
ResponderExcluir