Java 14 arrive



Selon Oracle, la sortie de Java 14 est prévue pour le 17 mars. Je me demande si la date de sortie est liée à la Saint-Patrick (qui est célébrée ce jour-là) ou non, nous le saurons très bientôt. Examinons les innovations qui seront disponibles dans le nouveau Java et décidons si nous allons boire de la bière pour la joie ou la douleur.

Records


Une fonctionnalité de langage fondamentalement nouvelle, disponible en mode aperçu dans Java 14. Le principal objectif est de se débarrasser de beaucoup de vermicelles dans le code. Les enregistrements doivent remplacer les classes utilisées uniquement pour stocker des données dans des champs sans aucun comportement décrit. Définissez Record et le compilateur lui-même générera les méthodes constructeur, getters, equals () et hashCode (), toString (). Quelque part, nous l'avons déjà vu, n'est-ce pas, monsieur Lombok? L'entrée est la suivante:

public record Person(String name, int age){}

Pour compiler Record, vous devez télécharger jdk14 et entrer la commande suivante:

javac —enable-preview —release 14 Person.java

Nous décompilons et voyons ce que le compilateur a fait:

public final class Person extends java.lang.Record {
    private final java.lang.String name;
    private final int age;

    public Person(java.lang.String name, int age) { /* compiled code */ }

    public java.lang.String toString() { /* compiled code */ }

    public final int hashCode() { /* compiled code */ }

    public final boolean equals(java.lang.Object o) { /* compiled code */ }

    public java.lang.String name() { /* compiled code */ }

    public int age() { /* compiled code */ }
}

Ainsi, au lieu de Record, nous avons obtenu une classe finale qui hérite de la nouvelle classe Record abstraite . Et comme prévu, nous avons obtenu les getters générés, constructeur, equals (), hashCode (), toString () . Notez que tous les champs sont marqués comme finaux , ce qui signifie que nous ne pouvons pas les redéfinir, cependant, l'enregistrement lui-même n'est pas complètement inchangé, car les objets stockés dans des champs peuvent être mutables. Une discussion détaillée de Record peut être trouvée ici .

NullPointerExceptions bavardes


NullPointerExceptions sera plus convivial . Non, le compilateur ne sait toujours pas comment réparer NPE pour nous, mais maintenant la description de l'exception deviendra plus informative. Nous simulons la situation: nous appelons NPE en Java 11 et Java 14. Par exemple, nous avons une composition complexe, typique d' Entity , et pour obtenir les données, nous devons appeler plusieurs objets depuis la source pour arriver au champ souhaité, et ainsi:

var street = message.getAuthor().getAddress().getStreet();

Dans Java 11, nous obtenons un ancien journal d'erreurs familier qui laisse la question principale: qui est nul? Message, auteur, adresse?

Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:11)

Pour fonctionner sur Java 14, vous devez compiler la classe de la même manière que Record ci-dessus:

javac —enable-preview —release 14 Main.java

Et exécutez en ajoutant un drapeau spécial:

java -XX:+ShowCodeDetailsInExceptionMessages --enable-preview Main

À la suite de l'exécution, nous obtenons la sortie suivante:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "Author.getAddress()" is null
	at Main.main(Main.java:11)

Comme nous pouvons le voir, le message est devenu plus informatif, et nous pouvons voir où exactement dans la chaîne d'appel NPE s'est produit .

Blocs de texte


Les blocs de texte réintroduits dans Java 13 sont également disponibles dans Java 14 en tant que fonctionnalité d'aperçu. Permettez-moi de vous rappeler que leur tâche principale est de simplifier le travail avec des littéraux multilignes. Une fonctionnalité très pratique pour écrire des requêtes SQL, du code HTML, JSON . Je pense que c'est l'une des fonctionnalités qui deviendra très utile. Rappelez-vous la syntaxe. Par exemple, nous devons écrire une requête SQL . Avant Java 13, nous utilisions la concaténation de chaînes pour écrire une requête lisible, et la requête ressemblerait à ceci:

String sql = "SELECT name, age " +
                 "FROM PERSON" +
                 "WHERE name = \'Igor\'" +
                 "AND car=\'Niva\'";

À partir de Java 13, nous pouvons utiliser un bloc de texte en écrivant une ligne entre des guillemets triples comme ceci:


    String sql = """ 
                 SELECT name, age 
                 FROM PERSON
                 WHERE name = 'Igor'
                   AND car='Niva'
                 """;

Java 14 ajoute deux nouveaux délimiteurs qui peuvent être utilisés dans des blocs de texte. Le premier est un espace unique: \ s . Le second est le caractère de nouvelle ligne: \ .

Changer d'expressions


À partir de Java 14, les expressions de commutateur passent d'une fonction d'aperçu à une fonction complète. Rappelons brièvement les caractéristiques du nouvel opérateur:

  • Syntaxe lambda
  • Possibilité d'utiliser plus d'une expression dans un cas
  • Sortie d'erreur en cas de couverture incomplète de l'ensemble des valeurs possibles de switch () . En d'autres termes, si vous utilisez une énumération:

    public enum  Car {
        NIVA, NEXIA, KIA
    }

    Ensuite, si vous écrivez switch () comme suit, le compilateur générera une erreur indiquant que tous les cas possibles de l'énumération ne sont pas répertoriés:

    switch (car) {
        case NIVA -> System.out.println("Niva");
        case NEXIA -> System.out.println("Nexia");
    }
    // error: the switch expressions does not cover all possible input values.

  • La possibilité de renvoyer une valeur:

    var avto = switch (car) {
        case NIVA, KIA -> "Niva are better";
        case NEXIA -> "Nexia";
        default -> "Niva still better";
    };


Correspondance de motifs


Pattern Matching est une nouvelle fonctionnalité d'aperçu disponible dans Java 14. Il y a eu beaucoup de discussions à ce sujet, beaucoup l'attendaient, et la voici. Le but est de combiner la vérification du type d'objet et sa conversion dans l'opérateur instanceof . En d'autres termes, avant Java 14, nous écrivions comme ceci:

Object obj = "Igor";

if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

Ceux. afin d'utiliser les méthodes de la classe qu'est l'objet, vous devez le caster dans cette classe. A partir de Java 14, une nouvelle syntaxe est disponible dans laquelle instanceof combine les fonctions de validation et de conversion:

Object obj = "Igor";

if (obj instanceof String s){
    System.out.println(s.length());
}

Conclusion


Java continue d'évoluer, facilitant la vie des développeurs mortels ordinaires. Les nouvelles fonctionnalités sont conçues pour rendre le code plus propre, la vie plus facile, des salaires plus élevés. Que pensez-vous, laquelle des nouvelles fonctionnalités gagnera l'amour de la communauté?

All Articles