AprĂšs six mois de dĂ©veloppement, la sociĂ©tĂ© Oracle la plateforme (Java Platform, Standard Edition 15), dont l'implĂ©mentation de rĂ©fĂ©rence est basĂ©e sur le projet ouvert OpenJDK. Java SE 15 maintient la compatibilitĂ© avec les versions prĂ©cĂ©dentes de la plateforme Java, tous les projets Java prĂ©cĂ©demment Ă©crits fonctionneront sans modifications sous la nouvelle version. Les distributions prĂȘtes Ă l'emploi de Java SE 15 (JDK, JRE et Server JRE) sont disponibles pour Linux (x86_64), Windows et macOS. La rĂ©fĂ©rence dĂ©veloppĂ©e dans le cadre du projet OpenJDK est entiĂšrement ouverte sous la licence GPLv2 avec des exceptions GNU ClassPath, permettant le liaison dynamique avec des produits commerciaux.
Java SE 15 est classĂ© parmi les versions avec un cycle de support standard, les mises Ă jour seront publiĂ©es jusqu'Ă la prochaine version. Pour une branche Ă long terme (LTS), il convient d'utiliser Java SE 11, dont les mises Ă jour seront fournies jusqu'en 2026. L'ancienne branche LTS Java 8 sera supportĂ©e jusqu'en dĂ©cembre 2020. La prochaine version LTS est prĂ©vue pour septembre 2021. Rappelons qu'Ă partir de Java 10, le projet a adoptĂ© un nouveau processus de dĂ©veloppement, avec un cycle de publication plus court. Les nouvelles fonctionnalitĂ©s sont dĂ©sormais dĂ©veloppĂ©es dans une branche principale constamment mise Ă jour, oĂč sont intĂ©grĂ©s les changements prĂȘts et dont sont dĂ©rivĂ©es des branches pour la stabilisation des nouvelles versions tous les six mois.
De :
- support de l'algorithme de création de signature numérique EdDSA (Edwards-Curve Digital Signature Algorithm ). L'implémentation proposée d'EdDSA est indépendante des plateformes matérielles, protégée contre les attaques par canaux latéraux (garantissant un temps de calcul constant) et surpasse l'implémentation existante d'ECDSA, écrite en C, tout en offrant un niveau de sécurité équivalent. Par exemple, EdDSA utilisant une courbe elliptique avec une clé de 126 bits montre des performances comparables à celles d'ECDSA avec la courbe elliptique secp256r1 et une clé de 128 bits.
- support expĂ©rimental des classes et interfaces scellĂ©es (« sealed »), qui ne peuvent pas ĂȘtre utilisĂ©es par d'autres classes et interfaces pour l'hĂ©ritage, l'extension ou la redĂ©finition de l'implĂ©mentation. Les classes scellĂ©es offrent Ă©galement un moyen plus dĂ©claratif d'en limiter l'utilisation, comparĂ© aux modificateurs d'accĂšs, en Ă©numĂ©rant explicitement les sous-classes autorisĂ©es Ă ĂȘtre Ă©tendues.
package com.example.geometry;
public sealed class Shape
permet com.example.polar.Circle,
com.example.quad.Rectangle,
com.example.quad.simple.Square {âŠ} - prise en charge des classes cachĂ©es qui ne peuvent pas ĂȘtre utilisĂ©es directement par le bytecode d'autres classes. L'utilisation principale des classes cachĂ©es est dans les frameworks qui gĂ©nĂšrent dynamiquement des classes Ă l'exĂ©cution et les utilisent indirectement, via . De telles classes ont gĂ©nĂ©ralement un cycle de vie limitĂ©, et donc leur maintien pour l'accĂšs Ă partir de classes gĂ©nĂ©rĂ©es statiquement n'est pas justifiĂ© et ne ferait qu'augmenter la consommation de mĂ©moire. Les classes cachĂ©es permettent Ă©galement de se passer de l'API non standard sun.misc.Unsafe::defineAnonymousClass, qui est prĂ©vue pour suppression Ă l'avenir.
- Le ramasse-miettes ZGC (Z Garbage Collector) a Ă©tĂ© stabilisĂ© et reconnu comme prĂȘt pour une utilisation gĂ©nĂ©ralisĂ©e. ZGC fonctionne en mode passif, minimisant autant que possible les dĂ©lais dus au ramassage des dĂ©chets (le temps d'arrĂȘt lors de l'utilisation de ZGC ne dĂ©passe pas 10 ms) et peut fonctionner avec des tas aussi petits qu'avec d'Ă©normes tas, allant de plusieurs centaines de mĂ©gaoctets Ă plusieurs tĂ©raoctets.
- StabilisĂ© et reconnu comme prĂȘt pour une utilisation gĂ©nĂ©ralisĂ©e
ramasse-miettes , fonctionnant avec des pauses minimales (Low-Pause-Time Garbage Collector). Shenandoah a Ă©tĂ© dĂ©veloppĂ© par Red Hat et se distingue par l'utilisation d'un algorithme qui rĂ©duit le temps d'arrĂȘt pendant le ramassage des dĂ©chets en nettoyant parallĂšlement l'exĂ©cution des applications Java. La taille des retards introduits par le ramasse-miettes est prĂ©visible et ne dĂ©pend pas de la taille du tas, c'est-Ă -dire que pour des tas de 200 Mo et de 200 Go, les retards seront identiques ( 50 ms et s'inscrivent gĂ©nĂ©ralement dans 10 ms); - La prise en charge des â nouvelles formes de littĂ©raux de chaĂźnes, permettant d'inclure dans le code source des donnĂ©es textuelles multi-lignes sans avoir besoin d'Ă©chapper les caractĂšres et en conservant le formatage d'origine du texte dans le bloc. Le bloc est encadrĂ© par trois guillemets doubles.
Par exemple, au lieu du code
String html = «<HTML>» +
«\n\t» + «<BODY>» +
«\n\t\t» + «<H1>\»Java 15 est là !\»<\/H1>» +
«\n\t» + «<\/BODY>» +
«\n» + «<\/HTML>»;On peut indiquer :
String html = «»»
<HTML>
<BODY>
«<H1>»Java 15\
est ici!»<\/H1>
<\/BODY>
<\/HTML>»»»; - API Legacy DatagramSocket. Les anciennes implĂ©mentations de java.net.DatagramSocket et java.net.MulticastSocket ont Ă©tĂ© remplacĂ©es par une mise en Ćuvre moderne, plus facile Ă dĂ©boguer et Ă entretenir, et compatible avec les flux virtuels dĂ©veloppĂ©s dans le cadre du projet . En cas de possible incompatibilitĂ© avec le code existant, l'ancienne implĂ©mentation n'a pas Ă©tĂ© supprimĂ©e et peut ĂȘtre rĂ©activĂ©e Ă l'aide de l'option jdk.net.usePlainDatagramSocketImpl.
- Une deuxiÚme implémentation expérimentale a été proposée dans l'opérateur «instanceof», qui permet de définir immédiatement une variable locale pour accéder à la valeur vérifiée. Par exemple, on peut écrire immédiatement «if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}» sans déclaration explicite de «String s = (String) obj».
Avant :
if (obj instanceof Group) {
Group group = (Group) obj;
var entries = group.getEntries();
}Maintenant, il est possible de se passer de la définition «Group group = (Group) obj» :
if (obj instanceof Group group) {
var entries = group.getEntries();
} - la deuxiÚme implémentation expérimentale du mot-clé ««, fournissant une forme compacte de définition de classes, permettant d'éviter la définition explicite de divers méthodes de bas niveau, telles que equals(), hashCode() et toString(), lorsque les données sont uniquement stockées dans des champs, dont le comportement ne change pas. Lorsque des implémentations types des méthodes equals(), hashCode() et toString() sont utilisées dans une classe, il est possible de se passer de leur définition explicite :
public record BankTransaction(LocalDate date,
double amount,
String description) {}Cette déclaration entraßnera l'ajout automatique des implémentations des méthodes equals(), hashCode() et toString() en plus du constructeur et des méthodes contrÎlant la modification des données (getter).
- deuxiÚme version préliminaire de l'API Foreign-Memory Access, permettant aux applications Java d'accéder de maniÚre sécurisée et efficace à des zones de mémoire en dehors du tas Java, à l'aide de nouvelles abstractions telles que MemorySegment, MemoryAddress et MemoryLayout.
- et la technique d'optimisation Biased Locking a été déclarée obsolÚte, utilisée dans HotSpot JVM pour réduire les frais liés aux verrous. Cette technique est devenue obsolÚte sur les systÚmes avec des instructions atomiques, fournies par les processeurs modernes, et trop difficile à maintenir en raison de sa complexité.
- mécanisme obsolÚte , qui sera supprimé dans l'une des futures versions. Il est à noter que l'Activation RMI est devenue obsolÚte, a été rétrogradée en option depuis Java 8 et est presque jamais utilisée dans la pratique moderne.
- moteur JavaScript , qui a été déclaré obsolÚte dans Java SE 11.
- ports pour le systÚme d'exploitation Solaris et les processeurs SPARC (Solaris/SPARC, Solaris/x64 et Linux/SPARC). La suppression des ports mentionnés permettra à la communauté d'accélérer le développement de nouvelles fonctionnalités d'OpenJDK, sans perdre de temps à maintenir des spécificités liées à Solaris et SPARC.
Source : opennet.ru
