Nouvelles fonctionnalités de Java 13

1. Vue d'ensemble

Septembre 2019 a vu la sortie du JDK 13, selon la cadence de six mois de la nouvelle version de Java . Dans cet article, nous examinerons les nouvelles fonctionnalités et améliorations introduites dans cette version.

2. Aperçu des fonctionnalités du développeur

Java 13 a introduit deux nouvelles fonctionnalités de langage, bien qu'en mode aperçu . Cela implique que ces fonctionnalités sont entièrement mises en œuvre pour que les développeurs les évaluent, mais ne sont pas prêtes pour la production. En outre, ils peuvent être supprimés ou rendus permanents dans les versions futures en fonction des commentaires.

Nous devons spécifier –enable-preview comme indicateur de ligne de commande pour utiliser les fonctionnalités d'aperçu . Regardons-les en profondeur.

2.1. Expressions de commutation (JEP 354)

Nous avons initialement vu des expressions de commutation dans le JDK 12. Les expressions de commutation de Java 13 s'appuient sur la version précédente en ajoutant une nouvelle instruction yield .

En utilisant yield , nous pouvons désormais renvoyer efficacement les valeurs d'une expression de commutateur :

@Test @SuppressWarnings("preview") public void whenSwitchingOnOperationSquareMe_thenWillReturnSquare() { var me = 4; var operation = "squareMe"; var result = switch (operation) { case "doubleMe" -> { yield me * 2; } case "squareMe" -> { yield me * me; } default -> me; }; assertEquals(16, result); }

Comme nous pouvons le voir, il est désormais facile d'implémenter le modèle de stratégie à l'aide du nouveau commutateur.

2.2. Blocs de texte (JEP 355)

La deuxième fonctionnalité d'aperçu est constituée de blocs de texte pour les chaînes multilignes telles que JSON intégré, XML, HTML, etc.

Auparavant, pour intégrer JSON dans notre code, nous le déclarerions comme un littéral String :

String JSON_STRING = "{\r\n" + "\"name\" : \"Baeldung\",\r\n" + "\"website\" : \"//www.%s.com/\"\r\n" + "}";

Maintenant, écrivons le même JSON en utilisant des blocs de texte String :

String TEXT_BLOCK_JSON = """ { "name" : "Baeldung", "website" : "//www.%s.com/" } """;

Comme cela est évident, il n'est pas nécessaire d'échapper des guillemets doubles ou d'ajouter un retour chariot. En utilisant des blocs de texte, le JSON intégré est beaucoup plus simple à écrire et plus facile à lire et à maintenir.

De plus, toutes les fonctions String sont disponibles:

@Test public void whenTextBlocks_thenStringOperationsWorkSame() { assertThat(TEXT_BLOCK_JSON.contains("Baeldung")).isTrue(); assertThat(TEXT_BLOCK_JSON.indexOf("www")).isGreaterThan(0); assertThat(TEXT_BLOCK_JSON.length()).isGreaterThan(0); } 

De plus, java.lang.String dispose désormais de trois nouvelles méthodes pour manipuler les blocs de texte:

  • stripIndent () - imite le compilateur pour supprimer les espaces blancs accidentels
  • translateEscapes () - traduit les séquences d'échappement telles que «\\ t» en «\ t»
  • formatted () - fonctionne de la même manière que String :: format, mais pour les blocs de texte

Jetons un coup d'œil à un exemple formaté String :::

assertThat(TEXT_BLOCK_JSON.formatted("baeldung").contains("www.baeldung.com")).isTrue(); assertThat(String.format(JSON_STRING,"baeldung").contains("www.baeldung.com")).isTrue(); 

Étant donné que les blocs de texte sont une fonctionnalité d'aperçu et peuvent être supprimés dans une version ultérieure, ces nouvelles méthodes sont marquées comme étant obsolètes.

3. Archives CDS dynamiques (JEP 350)

Le partage de données de classe (CDS) est une fonctionnalité importante de Java HotSpot VM depuis un certain temps déjà. Il permet aux métadonnées de classe d'être partagées entre différentes JVM pour réduire le temps de démarrage et l'empreinte mémoire . JDK 10 a étendu cette capacité en ajoutant l'application CDS (AppCDS) - pour donner aux développeurs le pouvoir d'inclure des classes d'application dans l'archive partagée. Le JDK 12 a encore amélioré cette fonctionnalité pour inclure les archives CDS par défaut.

Cependant, le processus d'archivage des classes d'application était fastidieux. Pour générer des fichiers d'archive, les développeurs devaient faire des essais de leurs applications pour créer d'abord une liste de classes, puis la vider dans une archive. Après cela, cette archive pourrait être utilisée pour partager des métadonnées entre JVM.

Avec l'archivage dynamique, JDK 13 a simplifié ce processus. Nous pouvons maintenant générer une archive partagée au moment où l'application se ferme . Cela a éliminé le besoin d'essais.

Pour permettre aux applications de créer une archive partagée dynamique au-dessus de l'archive système par défaut, nous devons ajouter une option -XX: ArchiveClassesAtExit et spécifier le nom de l'archive comme argument:

java -XX:ArchiveClassesAtExit= -cp  AppName

Nous pouvons ensuite utiliser l'archive nouvellement créée pour exécuter la même application avec l' option -XX: SharedArchiveFile :

java -XX:SharedArchiveFile= -cp  AppName

4. ZGC: mémoire non utilisée non validée (JEP 351)

Le Z Garbage Collector a été introduit dans Java 11 en tant que mécanisme de garbage collection à faible latence, de sorte que les temps de pause GC ne dépassent jamais 10 ms. Cependant, contrairement aux autres GC HotSpot VM tels que G1 et Shenandoah, il n'était pas équipé pour restituer la mémoire de tas inutilisée au système d'exploitation. Java 13 a ajouté cette fonctionnalité au ZGC.

Nous obtenons maintenant une empreinte mémoire réduite ainsi qu'une amélioration des performances.

À partir de Java 13, le ZGC renvoie désormais la mémoire non affectée au système d'exploitation par défaut , jusqu'à ce que la taille de tas minimale spécifiée soit atteinte. Si nous ne voulons pas utiliser cette fonctionnalité, nous pouvons revenir à la manière Java 11 en:

  • En utilisant l'option -XX: -ZUncommit, ou
  • Définition de tailles de segment égales minimum ( -Xms ) et maximum ( -Xmx )

De plus, ZGC a désormais une taille de segment maximale prise en charge de 16 To. Auparavant, 4 To était la limite.

5. Réimplémentation de l'ancienne API Socket (JEP 353)

Nous avons vu les API Socket ( java.net.Socket et java.net.ServerSocket ) comme partie intégrante de Java depuis son apparition. Cependant, ils n'ont jamais été modernisés au cours des vingt dernières années. Écrits en Java et C hérités, ils étaient encombrants et difficiles à maintenir.

Java 13 bucked this trend and replaced the underlying implementation to align the API with the futuristic user-mode threads. Instead of PlainSocketImpl, the provider interface now points to NioSocketImpl. This newly coded implementation is based on the same internal infrastructure as java.nio.

Again, we do have a way to go back to using PlainSocketImpl. We can start the JVM with the system property -Djdk.net.usePlainSocketImpl set as true to use the older implementation. The default is NioSocketImpl.

6. Miscellaneous Changes

Apart from the JEPs listed above, Java 13 has given us a few more notable changes:

  • java.nio – method FileSystems.newFileSystem(Path, Map) added
  • java.time – new official Japanese era name added
  • javax.crypto – support for MS Cryptography Next Generation (CNG)
  • javax.security – property jdk.sasl.disabledMechanisms added to disable SASL mechanisms
  • javax.xml.crypto – new String constants introduced to represent Canonical XML 1.1 URIs
  • javax.xml.parsers – new methods added to instantiate DOM and SAX factories with namespaces support
  • Unicode support upgraded to version 12.1
  • Support added for Kerberos principal name canonicalization and cross-realm referrals

De plus, quelques API sont proposées pour la suppression. Il s'agit notamment des trois méthodes String répertoriées ci-dessus et de l' API javax.security.cert .

Parmi les suppressions figurent l' outil rmic et les anciennes fonctionnalités de l'outil JavaDoc. Les implémentations pré-JDK 1.4 de SocketImpl ne sont plus prises en charge.

7. Conclusion

Dans cet article, nous avons vu les cinq propositions d'amélioration du JDK implémentées par Java 13. Nous avons également répertorié d'autres ajouts et suppressions notables.

Comme d'habitude, le code source est disponible sur sur GitHub.