Pular para o conteúdo principal

Java 8 ao 18: Mudanças mais importantes na plataforma Java

 

 

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

Text blocks:

String query = """

SELECT "EMP_ID", "LAST_NAME"

FROM "EMPLOYEE_TB";

"""

15

13

Novos métodos de String (formatted, stripIndent, translateEscapes)

15

 

Switch expressions:

boolean isWeekend = switch (day) {

case SATURDAY, SUNDAY -> true;

default -> false;

};

14

12

Novos métodos de String (indent, transform)

12

 

CompactNumberFormat class

12

 

Novos métodos de String (repeat, isBlank, strip, lines)

11

 

var type allowed in Lambda Parameters:

(@NonNull var x) -> process(x)

11

 

New HTTP client API

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

 

Flow API (reactive streams)

9

 

Java Platform Module System (modules)

9

 

Collection factory methods:

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

 

Multi-Resolution Image API

9

 

Stack-Walking API

9

 

Process API updates (informações detalhadas sobre processos, por ex. ID, onExit, destroy)

9

 

new methods in CompletableFuture API (delay, timeout)

9

 

Interface private methods

9

 

since and forRemoval in @Deprecated

9

 

Interface Default and Static Methods

8

 

Method References

8

 

Optional class

8

 

Lambda expressions

8

 

Functional interfaces

8

 

Stream API

8

 

Effectively Final Variables

8

 

Repeating Annotations

8

 

New Date Time API

8

 

 

New JDK tools and features since OpenJDK 8

 

Tool / feature

Desde

Preview desde

Packaging Tool

 

14

Epsilon (no-op) GC

 

11

Experimental Java-Based JIT Compiler (Graal VM)

 

10

Shenandoah GC

15

12

Z GC (JEP 377)

15

11

Helpful NullPointerExceptions

14

 

Launching Java files as scripts

11

 

Flight recorder (data collection framework for troubleshooting)

11

 

Docker Container Support:

-XX:-UseContainerSupport

10,

8u191

 

Flexible heap size selection:

-XX:MaxRAMPercentage

10,

8u191

 

Application Class-Data Sharing (CDS)

10

 

jlink – custom JRE image, subset of JRE

9

 

JShell (Java REPL) – run Java commands interactively

9

 

Multi-Release JAR Files

9

 

Compact Strings

9

 

 

Deprecated/removed features and APIs:

 

Feature / API

Depreciado desde

Removido desde

Deprecate Finalization for Removal (finalize() and similar methods)

18

 

Deprecate the Security Manager for Removal

17

 

Constructors of primitive wrapper classes (e.g. new Integer(1))

16

 

ParallelScavenge + SerialOld GC Combination

14

 

Applet API (Deprecated For Removal in Java 17)

9

 

RMI Activation

15

17

Strongly Encapsulate JDK Internals (except sun.misc.Unsafe and some more)

– internal JDK classes won’t be available anymore

9

17

Nashorn JavaScript Engine

11

15

Solaris and SPARC Ports

14

15

CMS GC

9

14

Pack200 Tools and API

11

14

Java FX (moved to OpenJFX)

 

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

javah Native-Header Generator

 

10

jhat Heap Visualizer

 

9

Launch-Time JRE Version Selection

 

9

rt.jar and tools.jar

 

9

The extension mechanism (java.ext.dirs property)

 

9

Rarely-Used GC Combinations

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




Comentários

Postar um comentário

Postagens mais visitadas deste blog

Java Records

  Java Records Imutável, Simples e limpa Esta funcionalidade da linguagem apareceu pela primeira vez na versão 14 como experimental e assim continuou até a versão 15 . Agora liberada de forma definitiva no Java 16 . O objetivo é ser possível ter classes que atuam como portadores transparentes de dados imutáveis. Os registros podem ser considerados tuplas nominais. Ou seja, após criado, um record não pode mais ser alterado. Records oferece uma uma sintaxe compacta para declarar classes que são portadores transparentes para dados imutáveis superficiais visando reduzir significamente o detalhamento dessas classes e irá melhorar a capacidade de leitura e manutenção do código. Vamos seguir um exemplo de uma classe chamada Pessoa . O primeiro exemplo vamos utilizar o modo tradicional. public class Pessoa { private String nome; private int idade; public Pessoa (String nome, int idade) { super (); this .nome = nome; this .idade = idade; } public String getNo

O suporte de longo prazo e o que o LTS significa para o ecossistema Java

A arte do suporte de longo prazo e o que o LTS significa para o ecossistema Java Aqui está o que o Java 17 tem em comum com o Java 11 e o Java 8. Em junho de 2018, há pouco mais de três anos, a Oracle e outros participantes do ecossistema Java anunciaram uma mudança no modelo de cadência de lançamento para Java SE. Em vez de ter um lançamento principal planejado a cada dois ou quatro anos (que geralmente se torna de três a quatro anos), um novo modelo de lançamento de recursos de seis meses seria usado: a cada três anos, um lançamento seria designado como Long-Term Support (LTS) e receba apenas atualizações trimestrais de segurança, estabilidade e desempenho. Esse padrão foi emprestado descaradamente do modelo de lançamento do Mozilla Firefox, mas o ajustou para ficar mais alinhado com os requisitos de uma plataforma de desenvolvimento. A primeira versão do Java lançada sob esse modelo foi o Java SE 11. O lançamento do Java SE 17, o segundo lançamento do LTS sob o novo