O documento resume as principais características e mudanças introduzidas nas versões Java 9, 10 e 11. Java 9 trouxe a modularização do JDK, ferramentas como o jlink e jdeps, arquivos JAR multi-versão e melhorias na API de coleções. Java 10 adicionou inferência de tipo para variáveis locais, melhor apoio a Docker e compartilhamento de classes de aplicativos. Java 11 removeu módulos legados, adicionou o Flight Recorder e algoritmos criptográficos ChaCha20 e Poly1305.
5. Java 9 Features
• (JEP 200) The Modular JDK
• (JEP 102) Process API Updates
• (JEP 110) HTTP 2 Client
• (JEP 222) jshell: The Java Shell
• (JEP 225) HTML5 Javadoc
• (JEP 226) UTF-8 Property Files
• (JEP 227) Unicode 7.0
• (JEP 269) Factory Methods for Collections
• (JEP 282) jlink: The Java Linker
• (JEP 238) Multi-Release JAR Files
• (JEP 241) Remove the hat Tool
• (JEP 248) Make G1 the Default Garbage Collector
• (JEP 251) Multi-Resolution Images
• (JEP 288) Disable SHA-1 Certificates
http://openjdk.java.net/projects/jdk9/
• (JEP 213) Milling Project Coin
• (JEP 259) Stack-Walking API
• (JEP 217) Annotations Pipeline 2.0
• (JEP 236) Parser API for Nashorn
• (JEP 158) Unified JVM logging
• (JEP 285) Spins-Wait Hints
• (JEP 268) XML Catalog API
• (JEP 277) Enhanced Deprecation
• (JEP 280) Indify String Concatenation
• (JEP 287) SHA-3 Hash Algorithms
• (JEP 295) Ahead-of-Time Compilation
• (JEP 262) TIFF Image I/O
• (JEP 254) Compact Strings
• (JEP 292) Implement Selected ECMAScript 6 in Nashorn
6. 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
15. 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
16. 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")
18. 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
};
19. Reactive Streams
• Suporte à programação reativa
- http://reactivestreams.org
• Interface Flow com suporte à publish-
subscribe
- Publisher, Subscriber,
Processor, Subscription
20. 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();
21. 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());
23. 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) { }
24. 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
- Applet API is deprecated now
$ 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
26. Javadoc Improvements
• Formato compatível com HTML5 markup
• Suporte a definição dos módulos (Jigsaw)
• Adicionado um novo mecanismo de consulta
27. Unicode 7.0/8.0
• Unicode 7: 2.834 new characters
• Unicode 8: 7.716 new characters
• Suporte à UTF-8 nos property files
string
.replaceAll("🚗 ", "value")
.replaceAll("🚫 ", “nextValue")
28. 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
29. G1 Garbage Collector
• G1 é o coletor padrão agora
• Multithreaded; com pausas
mais curtas e previsíveis
• Compacta o heap, reduzindo a
fragmentação
G1-GC
Parallel GC
31. Java 10 Features
• (JEP 286) Local-Variable Type Inference
• (JEP 296) Consolidate the JDK Forest into a Single Repository
• (JEP 304) Garbage-Collector Interface
• (JEP 307) Parallel Full GC for G1
• (JEP 310) Application Class-Data Sharing
• (JEP 312) Thread-Local Handshakes
• (JEP 313) Remove the Native-Header Generation Tool (javah)
• (JEP 314) Additional Unicode Language-Tag Extensions
• (JEP 316) Heap Allocation on Alternative Memory Devices
• (JEP 317) Experimental Java-Based JIT Compiler
• (JEP 319) Root Certificates
• (JEP 322) Time-Based Release Versioning
http://openjdk.java.net/projects/jdk/10/
32. Local-Variable Type Inference
• Inferência automática de tipos para variáveis locais
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
for (var item: list) {
// Indexes in the enhanced for-loop
}
for (var i; i < 10; i++) {
// Locals declared in a traditional for-loop
}
33. Local-Variable Type Inference
• !!!CUIDADO!!! Existem restrições para utilização
public int someMethod(var a, var b) {} // DOES NOT WORK - Method parameters
private var getFoo() { // DOES NOT WORK - Method return types
return "foo";
}
class SomeClass {
var someString = "Hello"; // DOES NOT WORK - Field class level
SomeClass(var someString) {} // DOES NOT WORK - Constructor parameters
}
var compareString = String::compareTo // DOES NOT WORK - Lambda expressions
try {} catch (var exception) {} // DOES NOT WORK - Try/catch expressions
34. Collection APIs Improvements
• Pequenas melhorias na API de coleções
List<T> newCopy = List.copyOf(anotherList);
Set<T> newCopy = Set.copyOf(anotherSet);
Map<T> newCopy = Map.copyOf(anotherMap);
List<Integer> result = Arrays.asList(1, 2, 3, 4).stream()
.collect(Collectors.toUnmodifiableList());
Set<Integer> set = IntStream.range(1, 5, 6, 7).boxed()
.collect(Collectors.toUnmodifiableSet());
Map<Integer, Double> map = IntStream.range(1, 5).boxed()
.collect(Collectors.toUnmodifiableMap(i -> i, i -> Math.pow(i, 3)));
36. Application Class-Data Sharing (CDS)
• Ajuda a reduzir consideravelmente o startup time e memory
footprint da aplicação
java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst
-cp hello.jar HelloWorld
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst
-XX:SharedArchiveFile=hello.jsa -cp hello.jar
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst
-XX:SharedArchiveFile=hello.jsa -cp hello.jar
Retorna a lista de classes para compartilhamento (hello.lst)
Cria o arquivo de compartilhamento para ser utilizado pelo CDS (hello.jsa)
Utiliza o arquivo de compartilhamento no startup da aplicação