Quoi ? Java évolue ?

Théorie De L'évolution De L'homme Illustration de Vecteur - Illustration du  isolement, âge: 118185128

Une version tous les 6 mois, c’est aujourd’hui le cycle de sortie des versions de notre bon vieux Java. Force est de constater que le contenu de ces versions n’est pas révolutionnaire et que le langage peine à sortir des features visibles au jour le jour dans notre développement sans avoir recours aux release preview retardant, de fait, inexorablement leur arrivée dans notre IDE favori.

 

La révolution c’est les records ?

 

It took long enough | This Isn't Even My Final Form | Know Your Meme

 

Le 14 Mars 2020, en plein confinement Covid, Java 14 débarque incluant le JEP 359 : Records (Java Enhancement Proposal)… puis le 15 Septembre 2020 Java 15 enrichit son propos via le JEP 384: Records (Second Preview) et finalement, un an après la première preview, les records, en version final, débarquent avec Java 16 (JEP 395: Records).

Mais c’est quoi ces records ?

Un record est une classe qui agit en tant que conteneur de données immutables. La principale motivation à l’arrivée de ce genre de concept vient du reproche fait communément au langage de sa trop grande verbosité ou de la répétitivé de certaines parties de codes. C’est d’ailleurs aujourd’hui une partie adressée non pas par Java mais par les IDE (via la génération de code) ou encore par les libraries comme Lombok ou Mapstruct avec tous les problèmes qui peuvent en découler… dépendances aux outils ou aux plugins IDE, montée de versions des librairies, prise en compte des upgrades de versions de Java etc.

En termes plus concrets, un record :

  • possède une liste d’attributs immutables (mot clé final en Java)
  • implémente automatiquement les méthodes types accessors, equals, hashcode et toString
  • un constructeur publique permettant d’initialiser les attributs
  • ne peut être ni être étendu (est considéré comme effectivement final), ni être abstract et ne peut possèder d’autres attributs d’instance que ceux définit pour le record
  • peut posséder des attributs static (commes des constantes)

Pour le reste, ils se comportent comme des classes normales et disposent donc des mêmes fonctionnalités et ajouts que celles-ci (generics , peuvent implémenter des interfaces, avoir des méthodes supplémentaires (static ou non) etc.).

Et cela donne...
public record ParametresTraitement(
        String codeAgence,
        UUID guidDossier,
        UUID guidCopropriete,
        Integer referenceCopropriete
) {}
Et son utilisation
  public static void main(String[] args) {
        final var parametresTraitement = new ParametresTraitement(
                "C",
                UUID.randomUUID(),
                UUID.randomUUID(),
                42
        );

        System.out.println(parametresTraitement.codeAgence());
        System.out.println(parametresTraitement.referenceCopropriete());
        System.out.println(parametresTraitement.guidDossier());
        System.out.println(parametresTraitement.guidCopropriete());
    }

Go avec réservesGO... Go... GOOOO! - Spartan300 | Meme Generator

Avec ce CV, les records, c’est plutôt une très bonne nouvelle pour le développement Java. Néanmoins, tout n’est pas mieux dans le meilleur des mondes. Depuis tout ce temps, les autres langages de programmations ont évolué et d’autres sont arrivés (dont certains empietent sur les plates bandes de Java comme Kotlin et ses data class). Et rapidement on s’aperçoit que la comparaison n’est pas la plus flatteuse :

  • TOUS les attributs doivent être final et donc pas de pattern builder, pas de mix entre attributs immutables et d’autres à valoriser a posteriori (mutables donc)
  • TOUT  passe par le constructeur.. et donc plus votre record possède de champs, plus l’instanciation de votre record nécessitera l’utilisation de ce constructeur  où TOUS les champs seront à valoriser… et tout ça, au detriment de la clarté de votre code (pas de named arguments ici)

Et rien que cela limitera sûrement votre champ d’utilisation.

 

Vers l’infini et au-delà

Feet of an athlete on a starting block about to run Photo ...

Nous l’avons vu, l’ajout des records n’est pas la panacée. Cependant, comme depuis Septembre 2021, la dernière LTS de Java les inclut, nous allons tâcher de vous montrer dans un prochain article, quelques cas réels d’utilisations de cette nouvelle feature, alors restez à l’affût sur les réseaux et à bientôt !