Fonctionnalités de Java 11

Nous ne nous sommes pas encore totalement immergés dans Java 10, et Java 11 est là. Java 11 est important pour plus que quelques raisons. Oracle a revu son modèle de support et a mis en place un train de versions qui apportera des mises à jour rapides, environ tous les 6 mois. Ils ont modifié le modèle de licence et de support, ce qui signifie que si vous téléchargez le JDK Oracle Java 11, cela sera payant pour une utilisation commerciale.

Est-ce que cela signifie que je dois désormais payer pour Java? PAS NÉCESSAIREMENT. Sauf si vous téléchargez le JDK Oracle et l’utilisez en production.

Note: IntelliJ IDEA 2018.2.4 Community Edition prend déjà en charge Java 11.

1. Pourquoi Java 11 est-il important?

Java 11 est la deuxième version LTS après Java 8. Depuis Java 11, le JDK Oracle ne sera plus gratuit pour une utilisation commerciale. Vous pouvez l’utiliser dans les phases de développement, mais pour une utilisation commerciale, vous devez acheter une licence. Sinon, vous risquez de recevoir une facture d’Oracle à tout moment! Java 10 était le dernier JDK Oracle gratuit pouvant être téléchargé. Oracle arrête le support de Java 8 depuis janvier 2019. Vous devrez payer pour un support supplémentaire. Vous pouvez continuer à l’utiliser, mais vous ne recevrez plus de correctifs/mises à jour de sécurité.

Oracle ne fournira pas de support à long terme gratuit (LTS) pour une seule version de Java depuis Java 11.

Bien que Oracle JDK ne soit plus gratuit, vous pouvez toujours télécharger les versions OpenJDK depuis Oracle ou d’autres fournisseurs tels que AdoptOpenJDK, Azul, IBM, Red Hat, etc. À mon avis, sauf si vous recherchez une utilisation de niveau Entreprise avec l’appétit de payer les frais de support, vous pouvez utiliser OpenJDK et les mettre à jour au besoin.

2. Quelle version de JDK devrais-je télécharger et quels sont leurs avantages respectifs?

Puisqu’Oracle a créé un train de versions où une nouvelle version est publiée tous les six mois, si vous utilisez l’Open JDK gratuit d’Oracle, vous devrez le mettre à jour tous les six mois, car Oracle ne fournira pas de mises à jour gratuites une fois la nouvelle version publiée. Cela peut être difficile à adapter pour une entreprise. Payez pour le support commercial à Oracle et migrez uniquement d’une version LTS à la suivante. De cette manière, vous obtiendrez toutes les mises à jour et le support pour Java 11 jusqu’en 2026. Vous pouvez télécharger Java 17 en 2022. Restez sur la version gratuite de Java même après la fin de son support. Bien que vous ne recevrez pas de mises à jour de sécurité et cela peut ouvrir des failles de sécurité.

Oracle ne fournira pas de support commercial ou de mises à jour pour Java 9 et Java 10. Vous devez donc rechercher d’autres versions alternatives pour continuer à les utiliser gratuitement.

Ayant compris les implications de Java 11, examinons maintenant les fonctionnalités importantes de Java 11 pour les développeurs. Nous discuterons également de quelques JEP importants. Remarque : JavaFX sera disponible en tant que module séparé et non lié au cycle de publication semestriel de Java JDK.

3. Comment télécharger la version gratuite de Java 11 ?

Vous pouvez télécharger la version OpenJDK prête pour la production à partir de ce lien. Les binaires sont au format tar ou zip, il suffit donc de les décompresser et de définir les variables d’environnement pour utiliser le compilateur Java et les commandes Java.

4. Fonctionnalités de Java 11

Voici quelques-unes des fonctionnalités importantes de Java 11 :

  • Exécution d’un fichier Java avec une seule commande
  • Nouvelles méthodes utilitaires dans la classe String
  • Syntaxe de variable locale pour les paramètres lambda
  • Contrôle d’accès basé sur les nids
  • JEP 321 : Client HTTP
  • Lecture/écriture de chaînes depuis et vers les fichiers
  • JEP 328 : Enregistreur de vol

Discutons des nouvelles fonctionnalités introduites avec Java 11 dans le cadre du processus JEP.

4.1) Exécution du fichier Java avec une seule commande

Un changement majeur est que vous n’avez pas besoin de compiler le fichier source Java avec l’outil javac d’abord. Vous pouvez exécuter directement le fichier avec la commande java et il compile implicitement. Cette fonctionnalité relève de JEP 330. Voici un aperçu des nouvelles méthodes de la classe String Java introduites en Java 11 :

4.2) Méthodes de chaîne Java

isBlank() – Cette méthode d’instance renvoie une valeur booléenne. Les chaînes vides et les chaînes contenant uniquement des espaces blancs sont traitées comme vides.

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Votre code ici !
        
        System.out.println(" ".isBlank()); //true
        
        String s = "Anupam";
        System.out.println(s.isBlank()); //false
        String s1 = "";
        System.out.println(s1.isBlank()); //true
    }
}

lines() – Cette méthode renvoie un flux de chaînes, qui est une collection de toutes les sous-chaînes séparées par des sauts de ligne.

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        
        String str = "JD\nJD\nJD"; 
        System.out.println(str);
        System.out.println(str.lines().collect(Collectors.toList()));
    }
}

La sortie du code ci-dessus est : strip(), stripLeading(), stripTrailing() strip() – Supprime les espaces blancs du début et de la fin de la chaîne.

Mais nous avons déjà trim(). Alors, à quoi sert strip()? strip() est une évolution « aware » Unicode de trim(). Lorsque trim() a été introduit, Unicode n’était pas évolué. Maintenant, le nouveau strip() supprime tous les types d’espaces blancs en tête et en queue (vérifiez la méthode Character.isWhitespace(c) pour savoir si un caractère Unicode est un espace blanc ou non)

Un exemple utilisant les trois méthodes ci-dessus est donné ci-dessous:

public class Main {
    public static void main(String[] args) throws Exception {
        // Votre code ici!
        
        String str = " JD "; 
        System.out.print("Start");
        System.out.print(str.strip());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripLeading());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripTrailing());
        System.out.println("End");
    }
}

La sortie dans la console à partir du code ci-dessus est: repeat(int) La méthode repeat répète simplement la chaîne autant de fois que spécifié dans la méthode sous forme d’un entier.

public class Main {
    public static void main(String[] args) throws Exception {
        // Votre code ici!
        
        String str = "=".repeat(2);
        System.out.println(str); //prints ==
    }
}

4.3) Syntaxe de variable locale pour les paramètres Lambda

JEP 323, Syntaxe de variable locale pour les paramètres de lambda est la seule nouveauté de fonctionnalité linguistique dans Java 11. En Java 10, l’inférence de type de variable locale a été introduite. Ainsi, nous pouvions déduire le type de la variable à partir du côté droit – var list = new ArrayList<String>(); JEP 323 permet à var d’être utilisé pour déclarer les paramètres formels d’une expression lambda typée de manière implicite. Nous pouvons maintenant définir :

(var s1, var s2) -> s1 + s2

C’était possible en Java 8 aussi mais cela a été supprimé en Java 10. Maintenant, c’est de retour en Java 11 pour maintenir l’uniformité. Mais pourquoi est-ce nécessaire alors que nous pouvons simplement ignorer le type dans la lambda? Si vous avez besoin d’appliquer une annotation comme @Nullable, vous ne pouvez pas le faire sans définir le type. Limitation de cette fonctionnalité – Vous devez spécifier le type var sur tous les paramètres ou aucun. Des choses comme ce qui suit ne sont pas possibles :

(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed

var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.

4.4) Contrôle d’accès basé sur le contexte imbriqué

Avant Java 11, c’était possible :

public class Main {
 
    public void myPublic() {
    }
 
    private void myPrivate() {
    }
 
    class Nested {
 
        public void nestedPublic() {
            myPrivate();
        }
    }
}

la méthode privée de la classe principale est accessible à partir de la classe imbriquée ci-dessus de la manière ci-dessus. Mais si nous utilisons la Réflexion Java, cela donnera une IllegalStateException.

Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);

Le contrôle d’accès imbriqué de Java 11 aborde cette préoccupation en matière de réflexion. La classe java.lang.Class introduit trois méthodes dans l’API de réflexion : getNestHost(), getNestMembers() et isNestmateOf().

4.5) JEP 309 : Constantes de fichiers de classe dynamiques

Le format de fichier de classe Java étend maintenant le support à une nouvelle forme de pool de constantes, CONSTANT_Dynamic. L’objectif de cette JEP est de réduire le coût et la perturbation du développement de nouvelles formes de contraintes de fichiers de classe matérialisables, en créant une seule nouvelle forme de pool de constantes qui peut être paramétrée avec un comportement fourni par l’utilisateur. Cela améliore les performances

4.6) JEP 318 : Epsilon : un ramasse-miettes sans opération

Contrairement au GC JVM qui est responsable de l’allocation et de la libération de mémoire, Epsilon n’alloue que de la mémoire. Il alloue de la mémoire pour les choses suivantes :

  • Tests de performance.
  • Tests de pression mémoire.
  • Tests d’interface VM.
  • Travaux extrêmement éphémères.
  • Améliorations de la latence en dernière instance.
  • Améliorations du débit en dernière instance.

Maintenant, Elipson est bon uniquement pour les environnements de test. Cela entraînera une OutOfMemoryError en production et fera planter les applications. L’avantage d’Elipson est qu’il n’y a pas de surcharge de nettoyage de la mémoire. Par conséquent, cela donnera un résultat de test de performance précis et nous ne pouvons plus effectuer de GC pour l’arrêter. Remarque : Il s’agit d’une fonctionnalité expérimentale.

4.7) JEP 320 : Supprimer les modules Java EE et CORBA

Les modules étaient déjà obsolètes dans Java 9. Ils sont maintenant complètement supprimés. Les packages suivants sont supprimés : java.xml.ws, java.xml.bind, java.activation, java.xml.ws.annotation, java.corba, java.transaction, java.se.ee, jdk.xml.ws, jdk.xml.bind

4.8) JEP 328 : Enregistreur de vol

Le Flight Recorder, qui était auparavant un module complémentaire commercial dans Oracle JDK, est désormais open source puisque Oracle JDK n’est plus gratuit. JFR est un outil de profilage utilisé pour recueillir des diagnostics et des données de profilage à partir d’une application Java en cours d’exécution. Sa surcharge de performance est négligeable et est généralement inférieure à 1%. Par conséquent, il peut être utilisé dans des applications de production.

4.9) JEP 321: Client HTTP

Java 11 standardise l’API Client HTTP. La nouvelle API prend en charge à la fois HTTP/1.1 et HTTP/2. Elle est conçue pour améliorer les performances globales de l’envoi de requêtes par un client et la réception de réponses du serveur. Elle prend également en charge nativement les WebSockets.

4.10) Lecture/Écriture de chaînes à partir des fichiers

Java 11 s’efforce de rendre la lecture et l’écriture de chaînes plus pratiques. Il a introduit les méthodes suivantes pour la lecture et l’écriture à partir/de fichiers:

  • readString()
  • writeString()

Le code suivant illustre un exemple de cela

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD

4.11) JEP 329: Algorithmes cryptographiques ChaCha20 et Poly1305

Java 11 fournit des implémentations des algorithmes de chiffrement ChaCha20 et ChaCha20-Poly1305. Ces algorithmes seront implémentés dans le fournisseur SunJCE.

4.12) JEP 315: Amélioration des intrinsèques Aarch64

Améliorer les intrinsèques de chaîne et de tableau existants, et implémenter de nouveaux intrinsèques pour les fonctions sin, cos et log de java.lang.Math, sur les processeurs AArch64.

4.13) JEP 333: ZGC : Un collecteur d’ordures à faible latence évolutif (Expérimental)

Java 11 a introduit un GC à faible latence. Il s’agit d’une fonctionnalité expérimentale. Il est bon de voir qu’Oracle accorde de l’importance aux GC.

4.14) JEP 335: Déprécation du moteur JavaScript Nashorn

Le moteur de script JavaScript Nashorn et ses APIs sont désormais dépréciés, ce qui indique qu’ils seront supprimés dans les prochaines versions.

5. Conclusion

Nous avons passé en revue les fonctionnalités importantes et les mises à jour fournies dans Java 11. À bientôt pour la sortie de Java 12.

Source:
https://www.digitalocean.com/community/tutorials/java-11-features