Você está na página 1de 33

Java (9)

As novidades da nova versão do Java

Rodrigo Cândido da Silva


@rcandidosilva
Agenda
• Modularidade (Jigsaw)
• Collection Factories
• Private Interface Methods
• Reactive Streams
• Process API
• HTTP/2
• JShell
• …
Java SE Timeline
• [1994] JDK Alpha e Beta • [2006] Java SE 6
• [1996] JDK 1.0 (8 pacotes!) • [2011] Java SE 7
• [1996] JDK 1.1 • [2014] Java SE 8
• [1998] Java 2 (J2SE 1.2)
• [2000] J2SE 1.3
• [2002] J2SE 1.4
•[2017] Java SE 9
• [2005] J2SE 5.0
• [2018] Java 18.3 ???
Modularidade (Jigsaw)
• Torna Java SE mais escalável e flexível
- IoT, Microservices
• Minimiza classpath hell
• Java standard classes foram modularizadas
- rt.jar tem agora 94 módulos definidos
• Possui alguns problemas de incompatibilidade com legado
- Mas pode ser desligado durante a execução
Modularidade (Jigsaw)
u l es
M o d
SE 9
Ja va
JDK/JRE File Structure
Modularidade (Jigsaw)
• O que é um módulo?
Modularidade (Jigsaw)
Modularidade (Jigsaw)
Modularidade (Jigsaw)
• Estrutura das aplicações
Java SE 8 Java SE 9
JLink
JLink
Multi-Release Jar Files
• JAR pode conter versões diferentes de classes e resources
• MANIFEST.MF contém Multi-Release: true
• Subdiretório /META-INF/versions contém um diretório com
número da versão
Collection Factories
• Novos métodos adicionados para criação de coleções imutáveis
-List, Set, Map
List immutableList = List.of();

List immutableList = List.of("one","two","three");

Map emptyImmutableMap = Map.of()

Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")


Private Interface Methods
• Possibilidade implementar métodos privados em interfaces
interface InterfaceWithPrivateMethods {
private static String staticPrivate() {
return "static private";
}

private String instancePrivate() {


return "instance private";
}

default void check() {


String result = staticPrivate();
(new InterfaceWithPrivateMethods() {}).pvt.instancePrivate();
}
}
Diamond Operator Extension
• Pode ser utilizado agora em conjunto com classes anônimas

FooClass<Integer> fc = new FooClass<>(1) { // anonymous inner class


};

FooClass<? extends Integer> fc0 = new FooClass<>(1) {


// anonymous inner class
};

FooClass<?> fc1 = new FooClass<>(1) { // anonymous inner class


};
Reactive Streams

Sync

Async
Reactive Streams
• Suporte à programação reativa
- http://reactivestreams.org
• Interface Flow com suporte à publish-
subscribe
- Publisher, Subscriber,
Processor, Subscription
Process API
• Melhorias na API para controlar e gerenciar processos do
sistema operacional

ProcessHandle self = ProcessHandle.current();


long PID = self.getPid();
ProcessHandle.Info procInfo = self.info();

Optional<String[]> args = procInfo.arguments();


Optional<String> cmd = procInfo.commandLine();
Optional<Instant> startTime = procInfo.startInstant();
Optional<Duration> cpuUsage = procInfo.totalCpuDuration();
HTTP/2
• Suporta conexões persistentes, cabeçalhos mais eficientes
dentre outra melhorias
• Nova API adicionada: java.net.http
- Substitui a antiga implementação HttpURLConnection

URI httpURI = new URI("http://localhost:8080");


HttpRequest request = HttpRequest.create(httpURI).GET();
HttpResponse response = request.response();
String responseBody = response.body(HttpResponse.asString());
JShell
• REPL (Read-Eval-Print-Loop)
• Novo comando adicionado no JDK: jshell
Try-With-Resources
• Não é mais necessário utilizar uma variável para ser gerenciada
pela estrutura

MyAutoCloseable mac = new MyAutoCloseable();


try (mac) {
// do some stuff with mac
}

try (new MyAutoCloseable() { }.finalWrapper.finalCloseable) {


// do some stuff with finalCloseable
} catch (Exception ex) { }
Enhanced Deprecation
• @Deprecated anotação suporta agora
- since - String que define a partir de quando
- forRemoval - indica que será removido na próxima versão
- jdeprscan - JDK tool para deprecation scan
$ jdeprscan --class-path classes example.Deprecations
class example/Deprecations uses type java/rmi/RMISecurityManager deprecated
class example/Deprecations uses method javax/swing/JList getSelectedValues()
deprecated

- Applet API is deprecated now


Stream Enhacements
• dropWhile() / takeWhile()
• Improved iterate
• Parallel Files.lines()
• Stream from Optional
Javadoc Improvements
• Formato compatível com HTML5 markup
• Suporte a definição dos módulos (Jigsaw)
• Adicionado um novo mecanismo de consulta
Unicode 7.0/8.0
• Unicode 7: 2.834 new characters
• Unicode 8: 7.716 new characters
string
.replaceAll("🚗 ", "value")
.replaceAll("🚫 ", “nextValue")

• Suporte à UTF-8 nos property files


Security Enhancements
• Melhoria performance GHASH e RSA
• Suporte para SHA-3 hash algorithm
• TLS application-layer protocol negotiation
• OCSP Stapling for TLS
• PKCS12 key stores by default (replaced JKS)
• Disabled SHA-1 certificate
G1 Garbage Collector G1-GC

• G1 é o coletor padrão agora


• Multithreaded; com pausas
mais curtas e previsíveis
• Compacta o heap, reduzindo a
fragmentação

Parallel GC
Compact Strings
Other Features
• Milling Project Coin (JEP 213)
• Stack-Walking API (JEP 259)
• Annotations Pipeline 2.0 (JEP 217)
• Parser API for Nashorn (JEP 236)
• Unified JVM logging (JEP 158)
• Spins-Wait Hints (JEP 285)
• XML Catalog API (JEP 268)
• etc…
Perguntas

?
Obrigado !
@rcandidosilva

Você também pode gostar