Java 13 a été publié pour une utilisation en production le 17 septembre 2019. Il n’y a pas beaucoup de fonctionnalités spécifiques aux développeurs dans Java 13 en raison du cycle de publication de 6 mois.
Fonctionnalités de Java 13
Certaines des fonctionnalités importantes de Java 13 sont :
- Text Blocks – JEP 355
- Nouvelles méthodes dans la classe String pour les blocs de texte
- Améliorations des expressions Switch – JEP 354
- Reimplémentation de l’API de socket héritée – JEP 353
- Archive CDS dynamique – JEP 350
- ZGC : Libération de mémoire inutilisée – JEP 351
- Méthode FileSystems.newFileSystem()
- Prise en charge de Unicode 12.1
- Usines DOM et SAX avec prise en charge des espaces de noms
Comment activer les fonctionnalités de prévisualisation
Les expressions Switch et les blocs de texte sont des fonctionnalités de prévisualisation. Vous devrez donc activer les paramètres de fonctionnalités de prévisualisation dans votre projet. Si vous exécutez un programme Java depuis la ligne de commande, vous pouvez l’activer en utilisant l’interrupteur --enable-preview
. Vous pouvez utiliser cet interrupteur pour démarrer JShell avec les fonctionnalités de prévisualisation activées.
$ jshell --enable-preview
$ java --enable-preview --source 13 Test.java
Si vous utilisez Eclipse IDE, vous pouvez activer les fonctionnalités de prévisualisation depuis les paramètres du compilateur Java du projet.

1. Blocs de texte – JEP 355
Ceci est une fonctionnalité de prévisualisation. Elle nous permet de créer facilement des chaînes de caractères multilignes. La chaîne de caractères multilignes doit être écrite à l’intérieur d’une paire de triples guillemets. L’objet chaîne créé à l’aide de blocs de texte n’a pas de propriétés supplémentaires. C’est une façon plus facile de créer des chaînes de caractères multilignes. Nous ne pouvons pas utiliser les blocs de texte pour créer une chaîne de caractères sur une seule ligne. Les triples guillemets d’ouverture doivent être suivis par un séparateur de ligne.
package com.journaldev.java13.examples;
public class TextBlockString {
/**
* JEP 355: Preview Feature
*/
@SuppressWarnings("preview")
public static void main(String[] args) {
String textBlock = """
Hi
Hello
Yes""";
String str = "Hi\nHello\nYes";
System.out.println("Text Block String:\n" + textBlock);
System.out.println("Normal String Literal:\n" + str);
System.out.println("Text Block and String Literal equals() Comparison: " + (textBlock.equals(str)));
System.out.println("Text Block and String Literal == Comparison: " + (textBlock == str));
}
}
Sortie :
Text Block String:
Hi
Hello
Yes
Normal String Literal:
Hi
Hello
Yes
Text Block and String Literal equals() Comparison: true
Text Block and String Literal == Comparison: true
C’est utile pour créer facilement des chaînes HTML et JSON dans notre programme Java.
String textBlockHTML = """
<html>
<head>
<link href='/css/style.css' rel='stylesheet' />
</head>
<body>
<h1>Hello World</h1>
</body>
</html>""";
String textBlockJSON = """
{
"name":"Pankaj",
"website":"JournalDev"
}""";
2. Nouvelles Méthodes dans la Classe String pour les Blocs de Texte
Il existe trois nouvelles méthodes dans la classe String, associées à la fonctionnalité des blocs de texte.
- formatted(Object… args) : elle est similaire à la méthode format() de String. Elle est ajoutée pour prendre en charge le formatage avec les blocs de texte.
- stripIndent() : utilisée pour supprimer les espaces blancs accidentels du début et de la fin de chaque ligne dans le bloc de texte. Cette méthode est utilisée par les blocs de texte et elle préserve l’indentation relative du contenu.
- translateEscapes(): renvoie une chaîne de caractères dont la valeur est cette chaîne, avec les séquences d’échappement traduites comme si elles étaient dans une chaîne littérale.
package com.journaldev.java13.examples;
public class StringNewMethods {
/***
* New methods are to be used with Text Block Strings
* @param args
*/
@SuppressWarnings("preview")
public static void main(String[] args) {
String output = """
Name: %s
Phone: %d
Salary: $%.2f
""".formatted("Pankaj", 123456789, 2000.5555);
System.out.println(output);
String htmlTextBlock = "<html> \n"+
"\t<body>\t\t \n"+
"\t\t<p>Hello</p> \t \n"+
"\t</body> \n"+
"</html>";
System.out.println(htmlTextBlock.replace(" ", "*"));
System.out.println(htmlTextBlock.stripIndent().replace(" ", "*"));
String str1 = "Hi\t\nHello' \" /u0022 Pankaj\r";
System.out.println(str1);
System.out.println(str1.translateEscapes());
}
}
Sortie:
Name: Pankaj
Phone: 123456789
Salary: $2000.56
<html>***
<body> *
<p>Hello</p>** *
</body>*
</html>
<html>
<body>
<p>Hello</p>
</body>
</html>
Hi
Hello' " /u0022 Pankaj
Hi
Hello' " /u0022 Pankaj
3. Améliorations des expressions switch – JEP 354
Les expressions switch ont été ajoutées en tant que fonctionnalité de prévisualisation dans la version Java 12. C’est presque la même chose en Java 13, sauf que le « break » a été remplacé par « yield » pour retourner une valeur à partir de l’instruction case.
package com.journaldev.java13.examples;
/**
* JEP 354: Switch Expressions
* https://openjdk.java.net/jeps/354
* @author pankaj
*
*/
public class SwitchEnhancements {
@SuppressWarnings("preview")
public static void main(String[] args) {
int choice = 2;
switch (choice) {
case 1:
System.out.println(choice);
break;
case 2:
System.out.println(choice);
break;
case 3:
System.out.println(choice);
break;
default:
System.out.println("integer is greater than 3");
}
// à partir de Java 13 - instructions case à plusieurs étiquettes
switch (choice) {
case 1, 2, 3:
System.out.println(choice);
break;
default:
System.out.println("integer is greater than 3");
}
// expressions switch, utilisez yield pour retourner, en Java 12 c'était break
int x = switch (choice) {
case 1, 2, 3:
yield choice;
default:
yield -1;
};
System.out.println("x = " + x);
}
enum Day {
SUN, MON, TUE
};
@SuppressWarnings("preview")
public String getDay(Day d) {
String day = switch (d) {
case SUN -> "Sunday";
case MON -> "Monday";
case TUE -> "Tuesday";
};
return day;
}
}
4. Réimplémenter l’API Socket héritée – JEP 353
L’implémentation sous-jacente des APIs java.net.Socket et java.net.ServerSocket a été réécrite. La nouvelle implémentation, NioSocketImpl, est un remplacement direct pour PlainSocketImpl. Elle utilise des verrous java.util.concurrent plutôt que des méthodes synchronisées. Si vous souhaitez utiliser l’implémentation héritée, utilisez l’option java -Djdk.net.usePlainSocketImpl.
5. Archive CDS dynamique – JEP 350
Ce JEP étend la fonctionnalité de partage de données de classe, qui a été introduite dans Java 10. Maintenant, la création d’une archive CDS et son utilisation sont bien plus faciles.
$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar
$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar
6. ZGC : Libération de la mémoire inutilisée – JEP 351
Ce JEP a amélioré ZGC pour rendre la mémoire du tas inutilisée au système d’exploitation. Le Z Garbage Collector a été introduit dans Java 11. Il ajoute un court temps de pause avant le nettoyage de la mémoire du tas. Cependant, la mémoire inutilisée n’était pas renvoyée au système d’exploitation. Cela posait problème pour les appareils avec une empreinte mémoire réduite, tels que les objets connectés et les microprocesseurs. Maintenant, il a été amélioré pour renvoyer la mémoire inutilisée au système d’exploitation.
7. Méthode FileSystems.newFileSystem()
Trois nouvelles méthodes ont été ajoutées à la classe FileSystems pour faciliter l’utilisation des fournisseurs de systèmes de fichiers, qui traitent le contenu d’un fichier comme un système de fichiers.
- newFileSystem(Path)
- newFileSystem(Path, Map<String, ?>)
- newFileSystem(Path, Map<String, ?>, ClassLoader)
8. Fabriques DOM et SAX avec prise en charge de l’espace de noms
Il existe de nouvelles méthodes pour instancier des fabriques DOM et SAX avec prise en charge de l’espace de noms.
- newDefaultNSInstance()
- newNSInstance()
- newNSInstance(String factoryClassName, ClassLoader classLoader)
//java 13 et plus
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder();
// avant Java 13
DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Conclusion
Il semble que la version de Java publiée tous les 6 mois fonctionne bien. Il n’y a pas beaucoup de fonctionnalités spécifiques aux développeurs, mais dans l’ensemble, c’est une excellente version. C’est bien de voir le support très attendu des blocs de texte.
Références
Source:
https://www.digitalocean.com/community/tutorials/java-13-features