Sortie d’OpenJDK 13

Posté par  . Édité par ZeroHeure, theojouedubanjo, Ysabeau 🧶 🧦, Davy Defaud, Cetera, xof et Julien Jorge. Modéré par Julien Jorge. Licence CC By‑SA.
Étiquettes :
48
24
sept.
2019
Java

Le 17 septembre 2019 est sortie cette nouvelle version d’OpenJDK. Elle comporte son lot de nouveautés, de fonctionnalités en préversion et des retraits. C’est aussi l’occasion de réécriture de certains composants, notamment l’API Socket pour l’inclusion des fils d’exécution — threads — locaux (aka Fibers). Les notes de version vous permettront d’avoir plus de détails.

Sommaire

Dynamique de développement

Contributions

Bien qu’Oracle reste le principal contributeur au projet, depuis les dernières versions, Red Hat et d’autres sociétés prennent en charge une part significative du travail, aux environs de 30 % des tickets pour la version 13. Plus de détails dans les billets du blog d’Oracle concernant la sortie des versions 12 et 13.

Rythme de publication et durée de maintenance

Depuis la sortie d’OpenJDK 9, le rythme de publication est passé à une version tous les six mois avec une maintenance raccourcie pour les versions sans support étendu (actuellement 9, 10, 12 et 13). À l’heure actuelle, les versions 8 et 11 ont un support de longue durée. Selon les distributions du JDK (Red Hat, IBM, Azul, Amazon, etc.) c’est encore différent.

Dans les épisodes précédents

Quelques nouveautés apparues

Mot clef « var »

La version 10 a vu l’apparition du mot clef var qui permet l’inférence de type et dont l’usage a été étendu aux expressions lambda dans la version 11. Cela permet de ne pas avoir à déclarer le type s’il est évident ou d’avoir à écrire un type trop verbeux. Il existe une liste de bonnes pratiques (ici ou ) pour éviter de rendre le code illisible.

Nouvelle méthode pour les collecteurs « Collectors::teeing »

Depuis la version 12, la méthode statique Collectors::teeing permet de récupérer dans un flux deux informations différentes et ensuite d’appeler une méthode pour exploiter les données obtenues. Cet article en anglais apporte plus de détails.

Nouveautés

Dans cette version les évolutions définitives sont principalement des mises à jour côté sécurité, des correctifs divers et variés ainsi que des améliorations de la machine virtuelle Java (JVM).

Dynamic CDS Archive JEP 350

C’est une extension d’un module libéré par Oracle dans le JDK 10 (Application Class‑Data Sharing JEP 310). Ce module permet des temps de chargement raccourcis et une empreinte mémoire plus faible en partageant certaines classes entre les processus Java. Cette extension simplifie l’usage du module grâce à quelques options :

  • archivage à l’arrêt ;
  • chargement d’une archive au démarrage.

ZGC : uncommit unused memory

ZGC est un ramasse‑miettes expérimental à faible latence. Il est présent depuis le JDK 11. Désormais, la mémoire peut être rendue au système d’exploitation en configurant les options. C’est bien pratique puisque désormais la taille maximale du tas (heap) est passée de 4 à 16 Tio.

Divers

Intégration d’Unicode 12.1, vous pourrez désormais avoir un émoji gilet jaune. Pour les personnes plus versées dans les aspects sécurité, la lecture du blog de Sean Mullan est une bonne chose.

Nouveautés en préversion

Il s’agit de fonctionnalités à découvrir et qui nécessitent une activation à la compilation. Elles sont d’ailleurs amenées à ne pas rester en l’état. Par exemple, les switch expressions en sont à leur seconde itération.

Expressions switch

Cette fonctionnalité est définie par la JEP 325. Il s’agit d’une des solutions pour rendre le code Java moins verbeux, et donc limiter le risque d’erreurs. Ainsi, le code :

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}

Peut désormais s’écrire de la manière suivante :

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

Ou encore si l’on veut affecter un résultat à une variable :

int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   yield 6;
  case TUESDAY
   yield 7;
  case THURSDAY
  case SATURDAY
   yield 8;
  case WEDNESDAY
   yield 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};

Text Block

Cette fonctionnalité est définie par la JEP 355. Les blocs de texte étaient initialement prévus pour la version 12 du JDK, mais au dernier moment ils ont été retirés faute de consensus sur le délimiteur et le comportement. L’idée est d’avoir du texte dont il est préférable de conserver le formatage pour des raisons de facilité d’écriture.
Par exemple, au lieu d’écrire :

String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, world</p>\n" +
              "    </body>\n" +
              "</html>\n";

String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
               "WHERE `CITY` = 'INDIANAPOLIS'\n" +
               "ORDER BY `EMP_ID`, `LAST_NAME`;\n";

Il est possible d’écrire :

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

String query = """
               SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
               WHERE `CITY` = 'INDIANAPOLIS'
               ORDER BY `EMP_ID`, `LAST_NAME`;
               """;

Ce guide exhaustif en anglais à destination des développeurs décrit les cas d’usage avec les bonnes et les mauvaises pratiques.

Futur

Avec le nouveau rythme de publication des JDK, les nouveautés arrivent de manière plus progressive. Ainsi, dans les prochaines versions, voici les améliorations qui devraient rendre le langage meilleur :

  • les Records, qui seront une sorte de data class telle que présente dans d’autres langages ;
  • les Sealed type, qui seront des types algébriques permettant de restreindre les possibilités ;
  • des NullPointerException plus explicites.

Aller plus loin

  • # distributions du jdk

    Posté par  . Évalué à 2.

    Selon les distributions du JDK (Redhat, IBM, Azul, Amazon, etc.) c’est encore différent.

    A quoi ça sert d'avoir différentes distributions du JDK, plutôt qu'une seule de référence?

    • [^] # Re: distributions du jdk

      Posté par  . Évalué à 7.

      Aujourd'hui que je sache ces distributions ont uniquement des contrats de support différents (en prix en durée etc). C'est juste une façon de matérialiser ça.

      https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

    • [^] # Re: distributions du jdk

      Posté par  (site web personnel, Mastodon) . Évalué à 6.

      C'est pour faire comme GNU/Linux!

      • [^] # Re: distributions du jdk

        Posté par  . Évalué à 4.

        Le parallèle n'est pas déconnant. Je ne pense pas que les contributeurs du noyau linux veulent faire du support. Ils tiennent juste leur projet.

        Avec le passage de l'upstream d'Oracle à OpenJDK, on a probablement la même organisation : les contributeurs OpenJDK sont « juste » des développeurs et ne veulent pas gérer du support. Ceux qui veulent faire du support font tout le taff de packaging etc. Debian continue de prendre OpenJDK parce qu'ils savent faire ce packaging (c'est ce qu'ils savent faire). Oracle/Amazon/whatever veulent proposer un Java sur leur plateforme et vont donc packager OpenJDK.

        https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

    • [^] # Re: distributions du jdk

      Posté par  . Évalué à 4. Dernière modification le 25 septembre 2019 à 14:49.

      des JVM's différentes
      des tests différents
      du support différent
      … etc

      cf. la doc commerciale d'Azul par exemple:
      https://www.azul.com/products/zulu-enterprise/jdk-comparison-matrix/

  • # triple quotes litterals

    Posté par  (site web personnel, Mastodon) . Évalué à 0.

    Les javaistes aiment bien taper sur les pythonistes mais pourtant copient de plus en plus de choses des inférieurs :o La dernière en date est la syntaxe heredoc (enfin) :)

    “It is seldom that liberty of any kind is lost all at once.” ― David Hume

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.