Thématiques principales

mercredi 15 janvier 2020

Evolution Java 10

Java évolue vite ! on avait vu dans un article Java 9 en novembre 2017. Cette version venait à peine de sortir! Avec ses nouveauté et ses modules mais c'était il a 3 ans déjà !

Ainsi si les précédentes versions de Java sortaient chaque fois avec plusieurs années d'écarts (embarquant du coup un contenu conséquent), le changement de politique de release d’Oracle consistant à sortir des versions plus régulièrement (tous les 6 mois à un an), à provoquer des contenus beaucoup moins complexe à appréhender.

Pourtant aujourd’hui on parle de java 14 pour février prochain! Il est donc temps de refaire un petit topo des nouveautés sorties depuis!



Commençons par java 10. Entre cette version 10 et la précédente version, la 9, seulement quelques mois sont passés, en effet la version 10 est sortie début 2018. En tout logique, les évolutions sont moins nombreuses et en fait il n’y en a qu’une et elle intéressera surtout les développeurs : l’introduction du mot clef var [j10-var] et le mécanisme d'inférence de type sur les variables locales!

Bien sur j'exagère, la version 10 de java vient bien évidemment d’autres évolutions [grandes-lignes] comme celle sur le garbage collector, son interface et son exécution dans des threads parallèles mais pour la majeur partie des développeurs, ce genre d’upgrade restera très transparent….

Il y à aussi les liste non modifiable [immut]:


    @Test
    public void vueNonModifiableTest()
    {
        var maList= new ArrayList<>(List.of("Premier", "second", "troisieme"));
        var vue= Collections.unmodifiableList(maList);
        maList.set(1, "Insert");

        assertEquals("Insert",maList.get(1));
        assertEquals("Insert",vue.get(1));
    }

    @Test
    public void essaiModifVueNonModifiable()
    {
        var maList= new ArrayList<>(List.of("Premier", "second", "troisieme"));
        var vue= Collections.unmodifiableList(maList);
        assertThrows(UnsupportedOperationException.class,() -> vue.set(1, "Insert"));
    }


Mais revenons donc à cette évolution de l'inférence de type et du mot clef var.

Celle ci va permettre tout simplement d’omettre le type lors de la déclaration d’une variable locale.


    @Test
    public void varJava9Way()
    {
        Object monObject=new Object() {
            public String toString()
            {
                return "Object";
            }
        };
        assertEquals("Object",monObject.toString());
    }

equivalent en Java 10 a:


    @Test
    public void varJava10Way()
    {
        var monObject=new Object() {
            public String toString()
            {
                return "Object";
            }
        };
        assertEquals("Object",monObject.toString());
    }


Il est évident que concernant les variables locale, cela peut être un plus de ne pas devoir se battre à chercher après les types de retour de méthode mais prudence, la simplicité ce n’est pas toujours de la lisibilité de gagné, il importe donc de respecter quelques règles d’usages et bonne pratique, par exemple de ne pas faire de déclaration trop éloigné de l’utilisation de la variable (déjà qu’à la base ce n'était pas conseillé mais la…) avoir des variables dont le nom est réellement explicite car la sinon on ne dispose ni du nom ni du type pour savoir ce que l’on manipule. En fait c’est avec ce nouveau mot clef que tout le clean code prend son sens! [j10-recommand] (À noter que je parle de var comme d’un nouveau mot clef… mais à ce stade, dans java 10, il ne s’agit pas encore d’un mot réservé du langage, donc prudence avec des variables mal nommées…., au hasard var….)

Alors on pourrait aussi se demander mais, est ce vraiment une évolution? C’est vrai ce mécanisme existait déjà dans groovy ou scala et était apporté par certain framework comme lombok! Du coup réellement est ce que ca vaut le coup?

Honnêtement, c’est une avancé mais qui nécessite prudence et rigueur. C’est un outil qui peut se retourner contre le développeur si celui ci l’utilise sans précaution. Son plus gros risque comme souvent et vous l’aurez deviné, ca sera la qualité du code résultante de cette emploi.

References

[grandes-lignes] https://dzone.com/articles/jdk-10-release-candidate-phase?edition=360091&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=Daily%20Digest%202018-02-08
[j10-recommand] https://dzone.com/articles/local-type-inference-cheat-sheet-for-java-10-and-b?edition=484291&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=Daily%20Digest%202019-05-16
[j10-var] https://blog.invivoo.com/les-nouveautes-de-java-10-episode-3/
[immut] https://blog.xebia.fr/2018/09/25/de-java-8-a-11-nouveautes-et-conseils-pour-migrer/

Aucun commentaire:

Enregistrer un commentaire