Java 15 est sortie,
https://mail.openjdk.java.net/pipermail/jdk-dev/2020-September/004733.html
Coté VM
- Deux nouveaux GCs
Shenandoah et ZGC sont production ready
- des lambdas qui occupent moins de meta-space avec les Hidden Classes (Emmanuel, cela devrait corrigé le bug dont tu m'avais parlé)
Coté language
- en version final
les texts blocks (les String entre """ """ sur plusieurs lignes),
- en preview
les records (classes simplifiés comme les data classes de Kotlin et les cases classes de Scala)
par ex: record Point(int x, int y) { }
les sealed types (qui limite les sous-types possibles, pareil repompé sur Kotlin/Scala mais les sealed types sont vérifiés par la VM)
par ex: sealed interface Figure permits Rectangle, Circle { }
le instanceof qui introduit une variable,
par ex: if (object instanceof Foo foo) { ... foo.x ... }
Les 3 dernières features continue l'idée d'introduire le pattern matching en Java
(à la fin du mail, il y a un exemple de comment utiliser les records et les sealed types pour implanter FizzBuzz)
Les IOs ré-implantés:
depuis Java 12, toutes les IOs sont entrain d'être ré-implanter pour permettre l'utilisation des threads virtuelles
en vu de l'intégration du projet loom, pour cette release, c'est l'API des DatagramSocket qui y passe.
Le Biased-locking déprécié:
Lorsqu'un synchronized bloque toujours le même thread, on peut gagner un peu en vitesse, en flaggant un objet comme appartenant toujours à la même thread.
Cette optiization marchait bien avec les anciens processeur qui avait l'instruction CAS (Compare And Set) lente (pour Intel c'est pré-Nehalem je crois),
maintenant, on gagne plus vraiment grand chose et l'implantation du biased locking utilise un précieux bit dand le header des objets
qui pourrait être utiliser à autre choses. Donc cette optimization est déprécié en 15 et retirer en 16.
Nouvelle APIs:
La version 2 de l'API Foreign-Memory Access, qui permet de déclarer et manipuler la mémoire off-heap sans passer par Unsafe.
Les appels directes au fonction C arrive dans la version 16 pour une intégration "native" sans JNI.
Features supprimées:
- Nashorn, personne pour assurer la maintenance, snif :(
- Remove the Solaris and SPARC Ports, pareil.
Voilà, voilà,
Rémi
---
import static java.util.stream.IntStream.rangeClosed;
import java.util.List;
public interface RecordFizzBuzz {
sealed interface Item {
static Item create(int value) {
return Special.ALL.stream().filter(s -> value % s.divisor == 0).findFirst().<Item>map(s -> s).orElseGet(() -> new Value(value));
}
}
record Value(int value) implements Item {
@Override
public String toString() {
return "" + value;
}
}
enum Special implements Item {
FizzBuzz(15), Buzz(5), Fizz(3)
;
final int divisor;
Special(int divisor) {
this.divisor = divisor;
}
static final List<Special> ALL = List.of(values());
}
static void main(String[] args) {
rangeClosed(1, 100).mapToObj(Item::create).forEach(System.out::println);
}
}