Helder da Rocha
Ficou mais fácil programar em
Java
25
16 de outubro de 2025
www.argonavis.com.br
helder@argonavis.com.br
Tecnologia * Ciência * Arte
HTML & tecnologias Web desde 1995
Autor de cursos e livros sobre
Java, XML e tecnologias Web
argonavis.com.br
Quem?
Helder da Rocha
@helderdarocha
helder@argonavis.com.br
Helder da Rocha
... desde 1995
Java ...
O que vamos discutir hoje?
A pergunt
a
de sempre: "Aind
a
v
a
le
a
pen
a
investir em J
a
v
a
?"
O que mudou nos últimos
a
nos: J
a
v
a
f
icou melhor?
O J
a
v
a
25 foi l
a
nç
a
do em 16-09-2025. J
a
v
a
8 tem 11
a
nos.
Qu
a
l J
a
v
a
você us
a
?
Dest
a
ques p
a
r
a
progr
a
m
a
dores,
desde o último LTS (J
a
v
a
21)
a
té o J
a
v
a
25
Recursos em prévi
a
no J
a
v
a
25
Alguém
ainda
programa
em Java?
https://www.jetbrains.com/lp/devecosystem-2024/
J
a
v
a
E... é fácil aprender?
~% java HelloWorld
Hello Java!
~% py HelloWorld.py
Hello Monty Python!
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
print("Hello, Monty Python!");
Primeiro progr
a
m
a
É fácil?
~% java HelloWorldInput.java
Digite uma mensagem: Здраствуй Землья!
Здраствуй Землья!
... depois de compil
a
r:
Segundo progr
a
m
a
4 grandes projetos do OpenJDK
Promovendo a evolução da linguagem Java moderna
Melhor
a
r
a
interoper
a
bilid
a
de entre o J
a
v
a
e
código n
a
tivo, com imp
a
cto n
a
comput
a
ç
ã
o de
a
lto desempenho, ML, IA, jogos, etc.
Moderniz
a
r o modelo de memóri
a
d
a
JVM p
a
r
a
a
proveit
a
r d
a
melhor form
a
os recursos de
h
a
rdw
a
re modernos
Torn
a
r m
a
is produtivo, f
á
cil e
a
gr
a
d
á
vel escrever
progr
a
m
a
s em J
a
v
a
Simpli
fi
c
a
r e torn
a
r m
a
is leves e e
fi
cientes
progr
a
m
a
s que us
a
m concorrênci
a
e thre
a
ds
Amber
P
a
n
a
m
a
V
a
lh
a
ll
a
Loom
95%
80%
45%
70% concluído
concluído
concluído
concluído
Projeto Amber
Simpli
fi
cando o Java com
Templ
a
te + multiline strings
Tipos primitivos em p
a
tterns,
instanceof e switch
Coleções sequenci
a
d
a
s (J
a
v
a
21 LTS)
_ V
a
ri
á
veis sem nome (J
a
v
a
22)
Flexibiliz
a
ç
ã
o do corpo de construtores
(J
a
v
a
25 LTS)
import module (J
a
v
a
25 LTS)
Arquivos-fonte comp
a
ctos;
void main() (J
a
v
a
25 LTS)
Java 25
PREVIEW 3
JEPs do
Decl
a
r
a
ç
ã
o com var (J
a
v
a
10)
Expressões em switch (J
a
v
a
14)
Blocos de texto """ (J
a
v
a
15)
Records (J
a
v
a
16)
var em l
a
mbd
a
s (J
a
v
a
11 LTS)
P
a
ttern m
a
tching com instanceof
(J
a
v
a
16) e switch (J
a
v
a
19)
sealed cl
a
sses (J
a
v
a
17 LTS)
Record p
a
tterns (J
a
v
a
19) Descontinuado
Design multi-paradigma
Evolução do Java moderno suporta diferentes estratégias de design
Polimor
f
ismo
Her
a
nç
a
Enc
a
psul
a
mento
Abstr
a
ç
ã
o
Modul
a
rid
a
de
P
a
cotes, módulos, cl
a
sses e objetos
Progr
a
m
a
ç
ã
o orient
a
d
a
a
d
a
dos
Imut
a
bilid
a
de e funções pur
a
s
Funções de ordem superior
L
a
mbd
a
Referênci
a
s de métodos
API de stre
a
ms
D
a
dos imut
á
veis
P
a
ttern m
a
tching
Tipos de d
a
dos
a
lgébricos
Records (AND type)
Cl
a
sses e interf
a
ces sel
a
d
a
s (OR type)
Progr
a
m
a
ç
ã
o orient
a
d
a
a
objetos
DADOS
OBJETOS
FUNÇÕES
Progr
a
m
a
ç
ã
o funcion
a
l
Timeline: 30 anos de Java
2000 2010 2020 2025
2005 2015
BETA
JDK
1.0
JDK
1.1
J2SE
1.2
J2SE
1.3
J2SE
1.4
J2SE
5.0
JAVA
6
JAVA
7
JAVA
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
LTS
LTS
LTS
LTS
LTS
JDBC
Java RMI
23 pacotes
Applet
AWT
8 pacotes
HotJava
<app>
Swing
J2EE+J2ME
Collec
ti
ons
HotSpot JVM
RMI/CORBA
JNDI
java.nio
JAXP
assert
JAAS, JSSE
Generics<T>
@Anotações
Autoboxing
enums
Varargs...
java.u
ti
l.concurrent
for-each
Java Memory Model
Rhino
Compiler API
JAX-WS
JDBC 4.0
JAXB 2.0
case: "String"
try autoclose
catch(A | B)
Operador <>
1_000, 0b1010
invokedynamic
Shell (REPL)
Modulos (Jigsaw)
Immutable collec
ti
on
HTTP/2
HTTP Client
var em lambda
> java Hello.java
Lambda
CompletableFuture
Stream API
java.
ti
me
Op
ti
onal
Class::method
var
Unmodif.
collec
ti
on
Expressões em
switch
jwebserver
@snippet
Records
instanceof
pa
tt
. match.
""" txt """
Sealed
classes
Virtual
threads
void main()
fl
ex Constructor
import module
_
> java Hello.java
mul
ti
fi
le
Project Amber
R.I.P
1995
Project Loom
Project V
a
Project P
a
Project Amber
Project Loom
Project P
a
Project V
a
Timeline OpenJDK pós-Java 8 LTS (2014)
2020 2025
2015
JAVA
8
LTS
HTTPClient
var em params Lambda
JVM roda arquivos *.java
> java Hello.java
record
Pa
tt
ern matching
com instanceof
sealed
classes
Virtual
threads
void main() + IO.println()
super() e this() no meio do construtor
import module
Unnamed _
JVM roda múl
ti
plos arqs. *.java
> java Hello.java
Lambdas
CompletableFuture
Stream API
java.time
Op
ti
onal
Notação Class::method
Expressões em
switch
Blocos de texto
""" txt """
JAVA
11
JAVA
17
JAVA
21
JAVA
25
LTS LTS LTS LTS
jshell (REPL)
Módulos (Jigsaw)
Immutable collec
ti
on
List.of
HTTP/2
var
List.copyOf
Collections.
unmodifiable*
Pa
tt
ern matching
com switch
jwebserver
@snippet
Qual Java
você usa?
Java Developer Ecosystem 2023
https://www.jetbrains.com/lp/devecosystem-2023/java/
Qual Java você usa? (% de
a
plic
a
ções J
a
v
a
em 2024)
Qual Java você usa?
J
a
v
a
21 J
a
v
a
17 J
a
v
a
11
J
a
v
a
8
J
a
v
a
23+
2024 (b
a
se
a
do n
a
s pesquis
a
s d
a
NewRelic e JetBr
a
ins)
Estado atual (2025) - estimativa
Considerando as linguagens Java LTS
~100% dos progr
a
m
a
dores J
a
v
a
s
a
bem J
a
v
a
8
~75% s
a
bem J
a
v
a
11
~50% s
a
bem J
a
v
a
17
~10% s
a
bem J
a
v
a
21
Estim
a
tiv
a
de
a
doç
ã
o em 2025
25
JAVA
JAVA
JAVA
JAVA
JAVA
Estim
a
tiv
a
s obtid
a
s
a
p
a
rtir de d
a
dos d
a
New Relic (
a
plic
a
ções),
JetBr
a
ins (usu
á
rios) +
a
jud
a
do Anthropic Cl
a
ude
record Point (int x, int y) {}
sealed interface Pet permits Dog, Cat {}
obj instanceof Cidade c
module
""" txt """
(var x, var y) -> x + y
List.of()
stream()
case DIA, NOITE -> "isto"
return switch (obj) {
case Integer i -> "Um inteiro " + i;
...
}
java Hello.java
Collections.unmodifiableSet()
jshell >>
System::out
(a, b) -> a + b CompletableFuture
jwebserver
/** @snippet
SequencedMap
Thread.ofVirtual()
if (obj instanceof Point(int x, int y))
38%
25%
23%
12%
1%
(MUNDO)
Java 22 a Java 25 LTS
Destaques desde o Java 21 LTS (2023)
• J
a
v
a
22: Unn
a
med v
a
ri
a
bles
a
nd p
a
tterns (Project Amber)
• J
a
v
a
25 LTS:
• Module import decl
a
r
a
tions (Project Amber)
• Flexible Constructor Bodies (Project Amber)
• Scoped v
a
lues (Project Loom)
• Comp
a
ct source
f
iles
a
nd inst
a
nce m
a
in methods (Project Amber)
• Preview 3: Primitive types in p
a
tterns, inst
a
nceof,
a
nd switch) (Project Amber)
• Prevew 5: Structured concurrency (Project Loom)
Unnamed variables (Java 22)
JEP 456
• Permite us
a
r o sublinh
a
do ( _ ) p
a
r
a
represent
a
r v
a
ri
á
veis loc
a
is, p
a
r
â
metros de exceções, p
a
r
â
metros
de l
a
mbd
a
s e componentes de p
a
drões que s
ã
o obrig
a
tórios m
a
s n
ã
o s
ã
o us
a
dos no código.
public void processar(Contrato c, Writer w) {
switch (c) {
case Recusado rec -> w.println("Motivo: " + rec.recusado());
case Finalizado _ -> w.println("Finalizado");
case Iniciado _ -> w.println("Iniciado");
}
}
public void validar (String s){
try {
int i = Integer.parseInt(s);
System.out.println(i + " é um número");
} catch (NumberFormatException _) {
System.out.println(s + " não é um número");
}
}
Objeto d
a
exceç
ã
o nunc
a
é us
a
d
a
no bloco V
a
ri
á
veis de p
a
dr
ã
o
n
ã
o s
ã
o us
a
d
a
s
button.addActionListener( _ -> {
System.out.println("Ativado!");
update();
}); Evento n
ã
o é
us
a
do no bloco
Projeto AMBER
Module import declarations
JEP 511
• Permite import
a
r todos os p
a
cotes export
a
dos por um módulo.
• Por exemplo:
import module java.compiler;
Equiv
a
lente
a
escrever:
import javax.annotation.processing.*;
import javax.lang.model.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import javax.lang.model.util.*;
import javax.tools.*;
Projeto AMBER
Flexible constructor bodies
JEP 513
• P
a
ss
a
a
permitir código
a
ntes de this() e super() (com restrições).
• Pode-se inici
a
liz
a
r membros de inst
â
nci
a
, ch
a
m
a
r métodos est
á
ticos (m
a
s n
ã
o pode ler v
a
ri
á
veis
ou ch
a
m
a
r métodos de inst
â
nci
a
)
• Útil p
a
r
a
f
a
zer v
a
lid
a
ç
ã
o ou correç
ã
o de v
a
lores
a
ntes de inici
a
liz
a
r
• Por exemplo:
public class DBConnection extends Conection {
public DBConection(String url) {
String finalUrl = url;
if (!url.startsWith("jdbc:")) {
finalUrl = "jdbc:" + url;
}
super(finalUrl);
this.initializePool();
}
}
Corrigindo
a
URL
a
ntes de construir o objeto
Antes er
a
necess
á
rio rep
a
ss
a
r ch
a
m
a
d
a
a
método est
á
tico loc
a
l
a
o construtor,
que er
a
ch
a
m
a
do n
a
supercl
a
sse.
Projeto AMBER
Scoped values
JEP 506
• Um
a
a
ltern
a
tiv
a
m
a
is e
f
iciente e segur
a
a
ThreadLocal e comp
a
tível com virtu
a
l thre
a
ds!
Projeto LOOM
class Antes {
private static final ThreadLocal<User>
CURRENT_USER = new ThreadLocal<>();
public void handleRequest(User user) {
try {
CURRENT_USER.set(user);
processRequest();
} finally {
CURRENT_USER.remove();
}
}
}
class Depois {
private static final ScopedValue<User>
CURRENT_USER = ScopedValue.newInstance();
public void handleRequest(User user) {
ScopedValue.where(CURRENT_USER, user)
.run(() -> processRequest());
}
}
Se você esquecer,
v
a
z
a
memóri
a
com
virtu
a
l thre
a
ds!
Muitos virtu
a
l thre
a
ds + Thre
a
dLoc
a
l = b
a
ix
a
perform
a
nce
• Imut
á
vel e e
f
iciente com virtu
a
l thre
a
ds
Virtu
a
l thre
a
ds (J
a
v
a
21/Loom) s
ã
o
thre
a
ds gerenci
a
dos pel
a
JVM (leves,
super esc
a
l
á
veis, f
á
ceis de us
a
r e
debug
a
r e comp
a
tíveis com Thre
a
ds
d
a
CPU). Aprend
a
a
us
a
r!
Fech
a
mento
a
utom
á
tico
(n
ã
o precis
a
de try-
f
in
a
lly)
Mut
á
vel
Compact source
fi
les and instance main methods
JEP 512
• Método main() de inst
â
nci
a
+ p
a
cote java.lang.IO + unn
a
med cl
a
sses
• Muito m
a
is f
á
cil escrever os primeiros progr
a
m
a
s em J
a
v
a
!
void main() {
IO.println("Alô, Recife!");
}
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
HelloWorld.java
AloRecife.java
~% javac HelloWorld.java
~% java HelloWorld
Hello, World!
~% java AloRecife.java
Alô, Recife!
Antes Depois
Projeto AMBER
Entrada de dados em linha de comando
Finalmente (quase) duas linhas
import java.util.Scanner;
public class HelloWorldInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Digite uma mensagem: ");
String message = scanner.nextLine();
System.out.println(message);
scanner.close();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class HelloWorldInput {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Digite uma mensagem: ");
String message = null;
try {
message = reader.readLine();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
reader.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
System.out.println(message);
}
}
void main() {
String msg = IO.readln("Digite uma mensagem: ");
IO.println(msg);
}
~% java HelloWorldInput.java
Digite uma mensagem: Alô Recife!
Alô Recife!
Antes do J
a
v
a
5
Antes do J
a
v
a
25
J
a
v
a
25
Hmmm...
Preview 3: pattern matching com tipos primitivos
JEP 507
• Suporte
a
p
a
ttern m
a
tching com tipos primitivos em todos os contextos
• instanceof e switch
a
gor
a
a
ceit
a
m todos os tipos primitivos
java --enable-preview
Object obj = -33.5;
if (obj instanceof int n) {
System.out.println("Inteiro: " + n);
}
switch (obj) {
case int n when n >= 0 -> System.out.println("Inteiro não negativo: " + i);
case int n when n < 0 -> System.out.println("Inteiro negativo: " + i);
case double d -> System.out.println("Ponto-flutuante: " + d);
default -> System.out.println("Outra coisa");
}
Em switch
Em instanceof
Projeto AMBER
Preview 5: concorrência estruturada
JEP 505
• Simpli
f
ic
a
a
progr
a
m
a
ç
ã
o concorrente: remove do progr
a
m
a
dor
a
respons
a
bilid
a
de de
ter que lid
a
r com f
a
lh
a
s em thre
a
ds sep
a
r
a
dos em t
a
ref
a
s rel
a
cion
a
d
a
s
• Exemplo (d
a
p
á
gin
a
do JEP 505): método p
a
r
a
a
ch
a
r um usu
á
rio e um pedido. Este recurso
evit
a
que el
a
s f
a
lhem ou tenh
a
m sucesso independentemente
Response handle() throws InterruptedException {
try (var scope = StructuredTaskScope.open()) {
Subtask<String> user = scope.fork(() -> findUser());
Subtask<Integer> order = scope.fork(() -> fetchOrder());
scope.join();
return new Response(user.get(), order.get());
}
}
Devolve result
a
do combin
a
do d
a
s du
a
s t
a
ref
a
s
Junt
a
a
s subt
a
ref
a
s,
prop
a
g
a
ndo su
a
s exceções
Execut
a
subt
a
ref
a
s (thre
a
ds sep
a
r
a
dos)
Cri
a
o escopo p
a
r
a
t
a
ref
a
estrutur
a
d
a
Fonte do exemplo: https://openjdk.org/jeps/505
java --enable-preview
Projeto LOOM
Conclusões
O novo J
a
v
a
é um
a
lingu
a
gem de propósito ger
a
l m
a
is modern
a
, m
a
is
f
á
cil de us
a
r, m
a
is e
f
iciente e multip
a
r
a
digm
a
.
Esse é o objetivo dos gr
a
ndes projetos do OpenJDK, qu
a
se
f
in
a
liz
a
dos.
O foco dest
a
a
present
a
ç
ã
o for
a
m
a
s novid
a
des p
a
r
a
progr
a
m
a
dores.H
á
v
á
rios outros novos recursos no J
a
v
a
25.
E ent
ã
o, você
a
ch
a
que
fi
cou m
a
is f
á
cil progr
a
m
a
r em J
a
v
a
25?
www.argonavis.com.br
helder@argonavis.com.br
www.linkedin.com/in/helderdarocha/

Palestra: Ficou mais fácil programar no Java 25

  • 1.
    Helder da Rocha Ficoumais fácil programar em Java 25 16 de outubro de 2025 www.argonavis.com.br helder@argonavis.com.br
  • 2.
    Tecnologia * Ciência* Arte HTML & tecnologias Web desde 1995 Autor de cursos e livros sobre Java, XML e tecnologias Web argonavis.com.br Quem? Helder da Rocha @helderdarocha helder@argonavis.com.br
  • 3.
    Helder da Rocha ...desde 1995 Java ...
  • 4.
    O que vamosdiscutir hoje? A pergunt a de sempre: "Aind a v a le a pen a investir em J a v a ?" O que mudou nos últimos a nos: J a v a f icou melhor? O J a v a 25 foi l a nç a do em 16-09-2025. J a v a 8 tem 11 a nos. Qu a l J a v a você us a ? Dest a ques p a r a progr a m a dores, desde o último LTS (J a v a 21) a té o J a v a 25 Recursos em prévi a no J a v a 25
  • 5.
  • 6.
    E... é fácilaprender? ~% java HelloWorld Hello Java! ~% py HelloWorld.py Hello Monty Python! public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } print("Hello, Monty Python!"); Primeiro progr a m a
  • 7.
    É fácil? ~% javaHelloWorldInput.java Digite uma mensagem: Здраствуй Землья! Здраствуй Землья! ... depois de compil a r: Segundo progr a m a
  • 8.
    4 grandes projetosdo OpenJDK Promovendo a evolução da linguagem Java moderna Melhor a r a interoper a bilid a de entre o J a v a e código n a tivo, com imp a cto n a comput a ç ã o de a lto desempenho, ML, IA, jogos, etc. Moderniz a r o modelo de memóri a d a JVM p a r a a proveit a r d a melhor form a os recursos de h a rdw a re modernos Torn a r m a is produtivo, f á cil e a gr a d á vel escrever progr a m a s em J a v a Simpli fi c a r e torn a r m a is leves e e fi cientes progr a m a s que us a m concorrênci a e thre a ds Amber P a n a m a V a lh a ll a Loom 95% 80% 45% 70% concluído concluído concluído concluído
  • 9.
    Projeto Amber Simpli fi cando oJava com Templ a te + multiline strings Tipos primitivos em p a tterns, instanceof e switch Coleções sequenci a d a s (J a v a 21 LTS) _ V a ri á veis sem nome (J a v a 22) Flexibiliz a ç ã o do corpo de construtores (J a v a 25 LTS) import module (J a v a 25 LTS) Arquivos-fonte comp a ctos; void main() (J a v a 25 LTS) Java 25 PREVIEW 3 JEPs do Decl a r a ç ã o com var (J a v a 10) Expressões em switch (J a v a 14) Blocos de texto """ (J a v a 15) Records (J a v a 16) var em l a mbd a s (J a v a 11 LTS) P a ttern m a tching com instanceof (J a v a 16) e switch (J a v a 19) sealed cl a sses (J a v a 17 LTS) Record p a tterns (J a v a 19) Descontinuado
  • 10.
    Design multi-paradigma Evolução doJava moderno suporta diferentes estratégias de design Polimor f ismo Her a nç a Enc a psul a mento Abstr a ç ã o Modul a rid a de P a cotes, módulos, cl a sses e objetos Progr a m a ç ã o orient a d a a d a dos Imut a bilid a de e funções pur a s Funções de ordem superior L a mbd a Referênci a s de métodos API de stre a ms D a dos imut á veis P a ttern m a tching Tipos de d a dos a lgébricos Records (AND type) Cl a sses e interf a ces sel a d a s (OR type) Progr a m a ç ã o orient a d a a objetos DADOS OBJETOS FUNÇÕES Progr a m a ç ã o funcion a l
  • 11.
    Timeline: 30 anosde Java 2000 2010 2020 2025 2005 2015 BETA JDK 1.0 JDK 1.1 J2SE 1.2 J2SE 1.3 J2SE 1.4 J2SE 5.0 JAVA 6 JAVA 7 JAVA 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 LTS LTS LTS LTS LTS JDBC Java RMI 23 pacotes Applet AWT 8 pacotes HotJava <app> Swing J2EE+J2ME Collec ti ons HotSpot JVM RMI/CORBA JNDI java.nio JAXP assert JAAS, JSSE Generics<T> @Anotações Autoboxing enums Varargs... java.u ti l.concurrent for-each Java Memory Model Rhino Compiler API JAX-WS JDBC 4.0 JAXB 2.0 case: "String" try autoclose catch(A | B) Operador <> 1_000, 0b1010 invokedynamic Shell (REPL) Modulos (Jigsaw) Immutable collec ti on HTTP/2 HTTP Client var em lambda > java Hello.java Lambda CompletableFuture Stream API java. ti me Op ti onal Class::method var Unmodif. collec ti on Expressões em switch jwebserver @snippet Records instanceof pa tt . match. """ txt """ Sealed classes Virtual threads void main() fl ex Constructor import module _ > java Hello.java mul ti fi le Project Amber R.I.P 1995 Project Loom Project V a Project P a
  • 12.
    Project Amber Project Loom ProjectP a Project V a Timeline OpenJDK pós-Java 8 LTS (2014) 2020 2025 2015 JAVA 8 LTS HTTPClient var em params Lambda JVM roda arquivos *.java > java Hello.java record Pa tt ern matching com instanceof sealed classes Virtual threads void main() + IO.println() super() e this() no meio do construtor import module Unnamed _ JVM roda múl ti plos arqs. *.java > java Hello.java Lambdas CompletableFuture Stream API java.time Op ti onal Notação Class::method Expressões em switch Blocos de texto """ txt """ JAVA 11 JAVA 17 JAVA 21 JAVA 25 LTS LTS LTS LTS jshell (REPL) Módulos (Jigsaw) Immutable collec ti on List.of HTTP/2 var List.copyOf Collections. unmodifiable* Pa tt ern matching com switch jwebserver @snippet
  • 13.
    Qual Java você usa? JavaDeveloper Ecosystem 2023 https://www.jetbrains.com/lp/devecosystem-2023/java/
  • 14.
    Qual Java vocêusa? (% de a plic a ções J a v a em 2024)
  • 15.
    Qual Java vocêusa? J a v a 21 J a v a 17 J a v a 11 J a v a 8 J a v a 23+ 2024 (b a se a do n a s pesquis a s d a NewRelic e JetBr a ins)
  • 16.
    Estado atual (2025)- estimativa Considerando as linguagens Java LTS ~100% dos progr a m a dores J a v a s a bem J a v a 8 ~75% s a bem J a v a 11 ~50% s a bem J a v a 17 ~10% s a bem J a v a 21 Estim a tiv a de a doç ã o em 2025 25 JAVA JAVA JAVA JAVA JAVA Estim a tiv a s obtid a s a p a rtir de d a dos d a New Relic ( a plic a ções), JetBr a ins (usu á rios) + a jud a do Anthropic Cl a ude record Point (int x, int y) {} sealed interface Pet permits Dog, Cat {} obj instanceof Cidade c module """ txt """ (var x, var y) -> x + y List.of() stream() case DIA, NOITE -> "isto" return switch (obj) { case Integer i -> "Um inteiro " + i; ... } java Hello.java Collections.unmodifiableSet() jshell >> System::out (a, b) -> a + b CompletableFuture jwebserver /** @snippet SequencedMap Thread.ofVirtual() if (obj instanceof Point(int x, int y)) 38% 25% 23% 12% 1% (MUNDO)
  • 17.
    Java 22 aJava 25 LTS Destaques desde o Java 21 LTS (2023) • J a v a 22: Unn a med v a ri a bles a nd p a tterns (Project Amber) • J a v a 25 LTS: • Module import decl a r a tions (Project Amber) • Flexible Constructor Bodies (Project Amber) • Scoped v a lues (Project Loom) • Comp a ct source f iles a nd inst a nce m a in methods (Project Amber) • Preview 3: Primitive types in p a tterns, inst a nceof, a nd switch) (Project Amber) • Prevew 5: Structured concurrency (Project Loom)
  • 18.
    Unnamed variables (Java22) JEP 456 • Permite us a r o sublinh a do ( _ ) p a r a represent a r v a ri á veis loc a is, p a r â metros de exceções, p a r â metros de l a mbd a s e componentes de p a drões que s ã o obrig a tórios m a s n ã o s ã o us a dos no código. public void processar(Contrato c, Writer w) { switch (c) { case Recusado rec -> w.println("Motivo: " + rec.recusado()); case Finalizado _ -> w.println("Finalizado"); case Iniciado _ -> w.println("Iniciado"); } } public void validar (String s){ try { int i = Integer.parseInt(s); System.out.println(i + " é um número"); } catch (NumberFormatException _) { System.out.println(s + " não é um número"); } } Objeto d a exceç ã o nunc a é us a d a no bloco V a ri á veis de p a dr ã o n ã o s ã o us a d a s button.addActionListener( _ -> { System.out.println("Ativado!"); update(); }); Evento n ã o é us a do no bloco Projeto AMBER
  • 19.
    Module import declarations JEP511 • Permite import a r todos os p a cotes export a dos por um módulo. • Por exemplo: import module java.compiler; Equiv a lente a escrever: import javax.annotation.processing.*; import javax.lang.model.*; import javax.lang.model.element.*; import javax.lang.model.type.*; import javax.lang.model.util.*; import javax.tools.*; Projeto AMBER
  • 20.
    Flexible constructor bodies JEP513 • P a ss a a permitir código a ntes de this() e super() (com restrições). • Pode-se inici a liz a r membros de inst â nci a , ch a m a r métodos est á ticos (m a s n ã o pode ler v a ri á veis ou ch a m a r métodos de inst â nci a ) • Útil p a r a f a zer v a lid a ç ã o ou correç ã o de v a lores a ntes de inici a liz a r • Por exemplo: public class DBConnection extends Conection { public DBConection(String url) { String finalUrl = url; if (!url.startsWith("jdbc:")) { finalUrl = "jdbc:" + url; } super(finalUrl); this.initializePool(); } } Corrigindo a URL a ntes de construir o objeto Antes er a necess á rio rep a ss a r ch a m a d a a método est á tico loc a l a o construtor, que er a ch a m a do n a supercl a sse. Projeto AMBER
  • 21.
    Scoped values JEP 506 •Um a a ltern a tiv a m a is e f iciente e segur a a ThreadLocal e comp a tível com virtu a l thre a ds! Projeto LOOM class Antes { private static final ThreadLocal<User> CURRENT_USER = new ThreadLocal<>(); public void handleRequest(User user) { try { CURRENT_USER.set(user); processRequest(); } finally { CURRENT_USER.remove(); } } } class Depois { private static final ScopedValue<User> CURRENT_USER = ScopedValue.newInstance(); public void handleRequest(User user) { ScopedValue.where(CURRENT_USER, user) .run(() -> processRequest()); } } Se você esquecer, v a z a memóri a com virtu a l thre a ds! Muitos virtu a l thre a ds + Thre a dLoc a l = b a ix a perform a nce • Imut á vel e e f iciente com virtu a l thre a ds Virtu a l thre a ds (J a v a 21/Loom) s ã o thre a ds gerenci a dos pel a JVM (leves, super esc a l á veis, f á ceis de us a r e debug a r e comp a tíveis com Thre a ds d a CPU). Aprend a a us a r! Fech a mento a utom á tico (n ã o precis a de try- f in a lly) Mut á vel
  • 22.
    Compact source fi les andinstance main methods JEP 512 • Método main() de inst â nci a + p a cote java.lang.IO + unn a med cl a sses • Muito m a is f á cil escrever os primeiros progr a m a s em J a v a ! void main() { IO.println("Alô, Recife!"); } public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } HelloWorld.java AloRecife.java ~% javac HelloWorld.java ~% java HelloWorld Hello, World! ~% java AloRecife.java Alô, Recife! Antes Depois Projeto AMBER
  • 23.
    Entrada de dadosem linha de comando Finalmente (quase) duas linhas import java.util.Scanner; public class HelloWorldInput { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Digite uma mensagem: "); String message = scanner.nextLine(); System.out.println(message); scanner.close(); } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class HelloWorldInput { public static void main(String[] args) { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Digite uma mensagem: "); String message = null; try { message = reader.readLine(); } catch (IOException e) { throw new RuntimeException(e); } finally { try { reader.close(); } catch (IOException e) { throw new RuntimeException(e); } } System.out.println(message); } } void main() { String msg = IO.readln("Digite uma mensagem: "); IO.println(msg); } ~% java HelloWorldInput.java Digite uma mensagem: Alô Recife! Alô Recife! Antes do J a v a 5 Antes do J a v a 25 J a v a 25 Hmmm...
  • 24.
    Preview 3: patternmatching com tipos primitivos JEP 507 • Suporte a p a ttern m a tching com tipos primitivos em todos os contextos • instanceof e switch a gor a a ceit a m todos os tipos primitivos java --enable-preview Object obj = -33.5; if (obj instanceof int n) { System.out.println("Inteiro: " + n); } switch (obj) { case int n when n >= 0 -> System.out.println("Inteiro não negativo: " + i); case int n when n < 0 -> System.out.println("Inteiro negativo: " + i); case double d -> System.out.println("Ponto-flutuante: " + d); default -> System.out.println("Outra coisa"); } Em switch Em instanceof Projeto AMBER
  • 25.
    Preview 5: concorrênciaestruturada JEP 505 • Simpli f ic a a progr a m a ç ã o concorrente: remove do progr a m a dor a respons a bilid a de de ter que lid a r com f a lh a s em thre a ds sep a r a dos em t a ref a s rel a cion a d a s • Exemplo (d a p á gin a do JEP 505): método p a r a a ch a r um usu á rio e um pedido. Este recurso evit a que el a s f a lhem ou tenh a m sucesso independentemente Response handle() throws InterruptedException { try (var scope = StructuredTaskScope.open()) { Subtask<String> user = scope.fork(() -> findUser()); Subtask<Integer> order = scope.fork(() -> fetchOrder()); scope.join(); return new Response(user.get(), order.get()); } } Devolve result a do combin a do d a s du a s t a ref a s Junt a a s subt a ref a s, prop a g a ndo su a s exceções Execut a subt a ref a s (thre a ds sep a r a dos) Cri a o escopo p a r a t a ref a estrutur a d a Fonte do exemplo: https://openjdk.org/jeps/505 java --enable-preview Projeto LOOM
  • 26.
    Conclusões O novo J a v a éum a lingu a gem de propósito ger a l m a is modern a , m a is f á cil de us a r, m a is e f iciente e multip a r a digm a . Esse é o objetivo dos gr a ndes projetos do OpenJDK, qu a se f in a liz a dos. O foco dest a a present a ç ã o for a m a s novid a des p a r a progr a m a dores.H á v á rios outros novos recursos no J a v a 25. E ent ã o, você a ch a que fi cou m a is f á cil progr a m a r em J a v a 25? www.argonavis.com.br helder@argonavis.com.br www.linkedin.com/in/helderdarocha/