Geekflare est soutenu par notre public. Nous pouvons gagner des commissions d'affiliation en achetant des liens sur ce site.
Partager sur:

Quoi de neuf dans Java 17 ?

nouveau en java 17
Scanner de sécurité des applications Web Invicti – la seule solution qui offre une vérification automatique des vulnérabilités avec Proof-Based Scanning™.

La version LTS (Long-Term-Support) du langage Java et de la plate-forme d'exécution Java 17 a été lancée le 14 septembre 2021. Voyons les nouveautés de Java 17 et si vous devez effectuer une mise à niveau.

De nombreuses applications utilisent des versions antérieures de Java, y compris les versions LTS antérieures de Java : Java 11 et Java 8.

Pourquoi les entreprises devraient-elles passer à la version Java la plus récente ? La mise à niveau vers Java 17 nécessite des efforts, principalement pour tirer le meilleur parti des nouvelles fonctionnalités et fonctions à l'intérieur de la JVM.

De nombreuses entreprises utilisent Docker et Images Docker pour passer facilement à Java 17 avec un minimum d'effort et de temps. Les développeurs peuvent définir leurs pipelines d'intégration/déploiement continu (CI/CD) et tout exécuter dans des images Docker. Cela n'affectera pas les autres équipes utilisant d'anciennes versions de Java, car elles peuvent utiliser d'anciennes images Docker.

JAVA 17 Features

Prise en charge de macOS et AArch64

L'une des fonctionnalités critiques de JVM ajoutées à cette version est l'amélioration de la prise en charge de macOS sur l'architecture AArch64 à l'aide de JEP 391. Elle prendra en charge la dernière série de processeurs (M1) Apple publiée avec leurs ordinateurs l'année dernière.

Ce n'est pas nécessairement un gros problème pour les utilisateurs sur ces plates-formes puisque certains fournisseurs ont lancé des versions de JDK qui prennent en charge cette architecture et renvoient même le support à partir de Java 8. Cependant, le sceau d'approbation officiel est essentiel pour assurer la maintenance et le support futurs de la plateforme. En comparaison, la prise en charge de la plate-forme Linux/AArch64 a été ajoutée à Java 9 et Windows/AArch64 dans Java 16.

Classes scellées

Classes scellées est une fonctionnalité qui a été introduite dans Java 17. La fonctionnalité Classes scellées a terminé sa phase d'essai et est devenue une plate-forme et un langage officiels dans Java 17. Elle permet à un développeur de spécifier les sous-types autorisés qu'un type peut avoir et empêcher les autres de l'étendre ou de la mettre en œuvre d'une manière qui n'est pas prévue.

Les classes scellées permettent également au compilateur de générer des erreurs au moment de la compilation lorsque vous essayez de convertir un type non scellé en un sous-type non autorisé. Java 17 apporte également un nouveau pipeline de rendu pour les applications AWT/Swing qui s'exécutent sur macOS en utilisant l'API Apple Metal au lieu d'OpenGL. Il dispose d'une API améliorée et de fonctionnalités améliorées pour générer des nombres aléatoires.

Changes, Deletions, and Limitations in Java 17

Java 17 apporte également plusieurs modifications, suppressions et nouvelles limitations.

Encapsulation des composants internes du JDK

Un changement est la conclusion du processus d'encapsulation de JDK Internals. La première fois que cela a été introduit était dans Java 9 et donnerait des avertissements pendant l'exécution lorsqu'un utilisateur tentait d'utiliser la réflexion ou similaire pour contourner les restrictions habituelles sur l'utilisation interne Apis. Des arguments de ligne de commande ont également été ajoutés pour réguler ce comportement.

À partir de Java 9, diverses API ont été créées pour offrir un moyen uniforme d'effectuer les tâches les plus couramment utilisées ; les utilisateurs utiliseraient ces API en interne. Avec Java 16, la valeur par défaut est passée d'un avertissement à la désactivation de l'accès à la levée d'une exception. Cependant, il utilise l'argument de ligne de commande pour modifier le comportement.

Avec Java 17, l'argument de ligne de commande est supprimé, et il est possible de désactiver cette restriction. Cela signifie que tous les accès non autorisés à ces API internes sont désormais protégés.

Sémantique à virgule flottante toujours stricte

Une « suppression » supplémentaire peut être décrite comme la réintroduction de la sémantique de virgule flottante toujours stricte. Java 1.2 a introduit des modifications à la valeur par défaut de la sémantique à virgule flottante dans Java qui permet à la JVM d'échanger une infime précision dans les calculs à virgule flottante pour améliorer les performances. Dans les classes et les méthodes où une sémantique stricte devait être utilisée, un strictfp mot-clé a été ajouté. Depuis lors, divers types de jeux d'instructions ont été introduits dans les CPU, ce qui permet d'utiliser une sémantique à virgule flottante stricte sans coût inutile. La nécessité d'implémenter une sémantique par défaut ou stricte a été éliminée.

Java 17 supprime la sémantique par défaut précédente et toutes les opérations à virgule flottante sont exécutées strictement. Le terme strictfpest toujours présent. Cependant, il n'a aucun effet et provoque un avertissement à compiler le temps.

Compilation à l'avance (AOT)

Java 9 a introduit la compilation anticipée (AOT) en tant que fonctionnalité expérimentale qui utilise le compilateur Graal, et un code JIT a été écrit à l'aide de Java. Java 10 a rendu le compilateur Graal utilisable en tant que compilateur JIT dans OpenJDK en incorporant l'interface JVMCI. Depuis sa sortie, il y a eu une grande amélioration. Le compilateur Graal a connu d'énormes progrès et a sa JVM sous le nom de GraalVM.

Activation RMI

L'activation du RMI a été supprimée dans JEP 407 suite à sa suppression de Java 8 et finalement dépréciée et marquée comme une exigence de suppression dans Java 15. L'activation RMI a fourni une méthode pour activer les ressources à la demande des objets distribués à l'aide de RMI. Cependant, il a vu une utilisation minimale, et une meilleure alternative est disponible dans le présent. Le reste du RMI n'est pas affecté par l'élimination de la partie Activation.

Suppression de l'API d'applet

L'API Applet a finalement été désignée pour être supprimée par JEP 398, initialement supprimé dans Java 9. L'API Applet offrait un moyen d'intégrer les contrôles Java AWT/Swing dans une page Web dans un navigateur. Cependant, aucun navigateur moderne ne peut prendre en charge cela, ce qui signifie que les applets ont été essentiellement inaccessibles au cours de la dernière décennie.

Responsable de la sécurité

La dépréciation la plus cruciale est qu'il s'agit du gestionnaire de sécurité ( JEP 411). Security Manager est utilisé depuis un certain temps depuis Java 1.0. Il a été conçu pour restreindre ce que Java pouvait faire localement sur la machine, comme limiter l'accès aux réseaux, fichiers et autres ressources réseau. Il essaie également de mettre en sandbox le code qui n'est pas fiable en bloquant la réflexion et des API spécifiques.

La fin de Security Manager a commencé dans Java 12. Un argument de ligne de commande a été ajouté pour bloquer l'utilisation du gestionnaire de sécurité lors de l'exécution. La modification apportée dans Java 17 signifie qu'un avertissement d'exécution sera généré dans la JVM lors de la tentative de définition d'un gestionnaire de sécurité, soit à partir de la ligne de commande, soit de manière dynamique lors de l'exécution.

Incubator and Preview Features

Beaucoup se sont demandé si Java 17 aurait des fonctionnalités de prévisualisation et d'incubateur, étant donné que Java 17 a été promu comme une version prise en charge à long terme. Java 17 dispose de deux modules incubateurs et d'une fonction de prévisualisation !

API vectorielle

API vectorielle ( JEP 414) est actuellement dans sa deuxième phase de l'incubateur. L'API permet aux développeurs de définir un calcul vectoriel que le compilateur JIT convertira ensuite en l'instruction vectorielle appropriée prise en charge par l'architecture CPU sur laquelle la JVM s'exécute (par exemple, en utilisant celles des jeux d'instructions SSE ou AVX).

Auparavant, les développeurs devaient utiliser des fonctions scalaires ou créer des bibliothèques natives spécifiques à la plate-forme. L'implémentation de l'API Vector en Java fournit également un mécanisme de secours transparent qui était compliqué dans les versions précédentes.

La standardisation de l'API Vector permet aux classes du JDK de l'utiliser. Les méthodes Java Arrays mismatch() pourraient être modifiées pour être exécutées sur Java à la place, éliminant ainsi la nécessité de maintenir et d'écrire plusieurs implémentations spécifiques aux plates-formes au sein de la JVM.

Fonction étrangère et API de mémoire

Une fonctionnalité supplémentaire de l'incubateur s'appelle l'API Foreign Function & Memory ( JEP 412). Il s'agit d'une évolution et d'une fusion de deux autres modules incubateurs de Java 16 qu'est The Foreign Linker API ( JEP 389) et l'API de mémoire étrangère ( JEP 393). Les deux fournissent un accès à la mémoire et au code natifs en utilisant une programmation de type statique écrite en Java.

Correspondance de modèle pour le commutateur

La dernière fonctionnalité de l'aperçu du langage inclus dans Java 17 est l'inclusion de Pattern Matching for Switch ( JEP 406). Cette fonctionnalité de langage étend les expressions et les instructions de commutateur en fonction du type, de la même manière que la syntaxe utilisée via Pattern Matching (JEP 394), qui est devenu standard avec Java 16.

Dans le passé, si vous vouliez effectuer différentes actions en fonction de la nature dynamique d'un objet, vous deviez construire une chaîne if-else à l'aide d'une instance de vérifications telles que :

String type(Object o) {
  if (o instanceof List) {
    return "A List of things.";
  }
  else if (o instanceof Map) {
    return "A Map! It has keys and values.";
  }
  else if (o instanceof String) {
    return "This is a string.";
  }
  else {
    return "This is something else.";
  }
}

En combinant l'expression de commutateur ainsi que la nouvelle fonctionnalité de correspondance de modèle pour les commutateurs, le processus peut être réduit à quelque chose de similaire à :

String type(Object o) {
  return switch (o) {
    case List l -> "A List of things.";
    case Map m -> "A Map! It has keys and values.";
    case String s -> "This is a string.";
    default -> "This is something else.";
  };
}

Comme vous l'avez peut-être remarqué, il y a la déclaration d'une variable en cours de vérification. Comme les autres variables de Pattern, la correspondance d'instance indique que cet objet a été vérifié et converti et qu'il est disponible à partir de la variable dans sa zone actuelle.

La fonction de prévisualisation est une autre étape vers la correspondance de motifs. L'étape suivante consiste à inclure la capacité de déconstruire les tableaux et les enregistrements.

Should You Upgrade to Java 17?

Oui, vous devez constamment mettre à niveau vers la version la plus récente, mais pas dès le premier jour. Le logiciel et les bibliothèques que vous utilisez n'ont peut-être pas été mis à jour pour inclure la compatibilité avec Java 17, vous devrez donc peut-être attendre un certain temps jusqu'à ce que cela soit fait.

Si vous êtes coincé avec une version LTS de Java comme Java 8 ou Java 11, il existe de nombreuses options dans le langage et dans la JVM elle-même qui nécessitent une mise à niveau jusqu'à Java 17. Comme il s'agit d'une version de maintenance à long terme, il y a de fortes chances que votre environnement de production soit éventuellement mis à jour vers Java 17 également.

Si vous commencez un tout nouveau projet ou si vous êtes en train de préparer votre projet pour Java 17, le passage à Java 17 le plus tôt possible est probablement le choix le plus efficace car il réduit les coûts de déplacement. Cela permet également aux développeurs travaillant sur le projet d'utiliser toutes les dernières fonctionnalités et le côté opérationnel.

Vous pouvez profiter des nombreuses améliorations qui se sont produites au cours des dernières années, telles que la prise en charge améliorée des conteneurs s'exécutant sur Java, ainsi que de nouvelles implémentations de ramasse-miettes à faible latence.

Merci à nos commanditaires
Plus de bonnes lectures sur le développement
Alimentez votre entreprise
Certains des outils et services pour aider votre entreprise à se développer.
  • Invicti utilise Proof-Based Scanning™ pour vérifier automatiquement les vulnérabilités identifiées et générer des résultats exploitables en quelques heures seulement.
    Essayez Invicti
  • Web scraping, proxy résidentiel, proxy manager, web unlocker, moteur de recherche et tout ce dont vous avez besoin pour collecter des données Web.
    Essayez Brightdata
  • Semrush est une solution de marketing numérique tout-en-un avec plus de 50 outils de référencement, de médias sociaux et de marketing de contenu.
    Essayez Semrush
  • Intruder est un scanner de vulnérabilités en ligne qui détecte les failles de cybersécurité de votre infrastructure, afin d'éviter des violations de données coûteuses.
    Essayez Intruder