25 choses que nous aimons dans Java

Publié le par Delphine Massenhove

JetBrains aime tous les langages de programmation et tous les types de développeurs, mais aujourd’hui c’est Java que nous mettons en avant car ce mois-ci, en mai 2020, Java fête ses 25 ans ! Nous profitons donc de cette occasion particulière pour partager 25 choses que nous aimons à propos de Java et de la JVM.

25 Things We Love About Java

Rétrocompatibilité

Java est l’un des seuls langages capable d’exécuter du code conçu il y a 25 ans sur une version moderne de Java. Les développeurs du langage prennent la rétrocompatibilité très au sérieux et de nombreuses organisations choisissent Java comme principale plateforme de développement car elles savent que le code fonctionnera encore sur la JVM pour des années.

Maturité

Il y a beaucoup d’avantages à exister depuis longtemps. Au cours des 25 dernières années, les développeurs ont écrit des applications en Java pour un grand nombre de secteurs et types d’entreprises, et pour différentes plateformes. Parallèlement, depuis 25 ans, les développeurs apprennent ce langage dans des écoles, des universités, des boot camps et au travail. Ce vaste écosystème a eu le temps de tirer des enseignements de ses expériences et continue de se développer. Java, et les problèmes qu’il peut résoudre, est bien documenté et largement soutenu par des distributeurs, des associations et des utilisateurs. De plus, la maturité et la large adoption de Java génèrent de nombreuses opportunités d’emplois pour les développeurs souhaitant coder en Java !

Amélioration constante

L’évolution de la plateforme et du langage contraste avec sa rétrocompatibilité et sa maturité. Depuis 2017 (Java 9), une nouvelle version a été publiée tous les six mois, ce qui a permis un flux constant de modifications et d’améliorations du langage. Par ailleurs, avec les fonctionnalités en preview, le langage expérimente de nouvelles syntaxes, bénéficie des retours d’expérience des développeurs et standardise les nouvelles fonctionnalités les plus à même de satisfaire les utilisateurs.

Équilibre

Java a un équilibre difficile à trouver entre la rétrocompatibilité et l’ouverture sur l’avenir. L’approche actuelle qui consiste à valoriser la rétrocompatibilité et à publier une version tous les six mois, avec toutefois une version LTS (long term support) tous les trois ans, semble parvenir à un juste équilibre. Le langage est capable d’évoluer en fournissant des avertissements pour les fonctionnalités obsolètes qui seront supprimées et en prévoyant des remplacements pour tout ce qui est susceptible de disparaître.

Ceux qui souhaitent une plus grande stabilité peuvent rester sur les versions LTS. Pour réduire les risques au moment de la mise à jour, ils peuvent effectuer des tests périodiques sur les versions semestrielles.Ceux qui souhaitent effectuer une mise à jour tous les six mois peuvent passer à la dernière version de Java chaque fois qu’elle est publiée. Les développeurs qui veulent essayer une nouvelle syntaxe avant même qu’elle ne soit standardisée peuvent activer les fonctionnalités en preview et ceux qui veulent le faire dès que possible peuvent même utiliser la version Early Access.Les équipes utilisant des versions modernes de Java peuvent vraiment bénéficier du meilleur de tous les mondes.

Standards

Les standards ne sont peut-être pas aussi intéressants pour un développeur que les fonctionnalités du langage, mais le fait d’avoir des standards pour Java, pour Java EE et Jakarta EE, et pour les cas d’utilisation que les développeurs rencontrent couramment, facilite la vie des développeurs.Comprendre l’utilisation de JDBC pour dialoguer avec une base de données évite d’avoir à se soucier de la manière dont le pilote de la base de données est implémenté, car notre façon d’interagir avec elle est toujours la même.Le JCP est l’un des processus utilisés pour déterminer les standards pour Java.

La documentation Java Language Specification décrit les concepts de Java et comment le compilateur doit fonctionner. Cela comprend le Java Memory Model, qui peut permet d’anticiper comment une application pourrait se comporter, indépendamment de la JVM ou du matériel. La documentation Java Virtual Machine Specification présente les détails de niveau bas dans la JVM. Ces spécifications permettent aux JDK distribués par différents fournisseurs, fonctionnant sur différentes plateformes, de se comporter de manière spécifique et prévisible. Ce qui nous conduit à…

Write once, run anywhere (écrivez une fois, exécutez partout)

WORA était l’une des idées novatrices à l’origine de Java, ce qui semble si évident de nos jours que nous ne réalisons pas à quel point cette idée était révolutionnaire. J’ai travaillé pour une très grande entreprise qui est passée à Java en 2002 principalement parce qu’elle disposait déjà de nombreuses machines différentes : le fait de pouvoir exécuter de nouvelles applications Java sur ces machines au lieu de devoir acheter du matériel spécifique pour les applications l’a décidé à opter pour Java. Aujourd’hui, à l’ère du Cloud, cela peut sembler moins pertinent, mais bien que nous ne voyions pas toujours ce concept de WORA en action nous en tirons toujours profit. Et bien sûr, si vous utilisez IntelliJ IDEA (ou NetBeans), vous profitez des avantages du WORA sur ordinateur.

Performance

Cela surprend parfois ceux qui sont moins familiers avec Java, mais Java est un langage très performant. C’est une plateforme mature qui bénéficie de 25 ans d’amélioration des performances, de nombreux récupérateurs de mémoire avec différents profils de performances ; et la JVM optimise notre code à l’exécution pour nos cas d’utilisation réels en production bien mieux que ne pourraient le faire la plupart des développeurs. Java est par exemple largement utilisé dans le monde de la finance, qui dépend de transactions à faible latence et et requiert des performances prévisibles.

Nettoyage de la mémoire

Le nettoyage automatique de la mémoire est une autre chose que, 25 ans plus tard, nous considérons généralement comme allant de soi. Nous n’avons pas à réfléchir à la manière dont la mémoire est allouée dans nos applications, ni à la manière de la libérer. Chaque JVM a un ou plusieurs algorithmes de nettoyage de la mémoire différents, nous pouvons donc en choisir un qui fonctionne bien pour notre application sans avoir à trop nous préoccuper de son fonctionnement interne, nous pouvons continuer à nous consacrer à l’écriture de la logique du système pour nos applications.

Observabilité et gestion

Si nous souhaitons savoir ce qui se passe pendant le fonctionnement de notre application, nous disposons d’un grand nombre d’outils. Beaucoup d’entre eux sont même gratuits, notamment depuis que Java Flight Recorder et Mission Control ont été intégrés à OpenJDK (depuis Java 11). Des outils comme JMX permettent même une gestion dynamique de nos applications.

La machine virtuelle Java (JVM)

La plupart des fonctionnalités que nous venons de mentionner sont des fonctionnalités de la JVM, mais nous voulons évoquer la JVM spécifiquement, et notamment le fait qu’elle soit séparée du langage Java. Il y a de nombreuses raisons d’aimer la JVM, parmi lesquelles certaines des choses que nous avons déjà évoquées : WORA, l’optimisation de l’exécution, les performances, le choix des distributeurs, etc., dont une grande partie est rendue possible grâce aux standards et aux spécifications. Il est important que la JVM soit séparée du langage Java aussi car cela rend possible la création de différents langages à partir de la plateforme en tirant parti de toutes les fonctionnalités de la JVM, tout en fournissant différents types de caractéristiques syntaxiques et linguistiques.

Autres langages de la JVM

Si Java a survécu, et a même continué d’évoluer, dans les années creuses entre Java 6 et 8 (Java 7 a quelques bonnes fonctionnalités mais n’a pas été considérée comme une version majeure par les développeurs), c’est notamment grâce aux autres langages de la JVM. Chez JetBrains, notre préféré est bien sûr Kotlin, mais la JVM a aussi permis la création d’autres langages populaires tels que Groovy, Scala, Clojure et JRuby, et un grand nombre d’autres langages, nouveaux ou réimplémentés. Dans de nombreux cas, l’interopérabilité entre ces langages et le Java classique nous permet de tirer parti de cette diversité.

Bibliothèques et frameworks

L’un des plus grands avantages est l’énorme choix que nous avons en matière de bibliothèques et de frameworks, dont un grand nombre sont open source et gratuits. Des frameworks populaires tels que Spring, et Spring Boot en particulier, permettent de créer facilement toute sorte d’applications, allant de petits services à des applications plus complexes et de grande envergure. Les standards font qu’il est souvent assez facile de comprendre et d’utiliser une bibliothèque lorsque l’on a déjà utilisé quelque chose de similaire dans un autre contexte. Grâce à la maturité de Java et à l’adoption précoce de l’open source par la communauté, il existe généralement une solution aux problèmes courants et que nous n’avons donc pas à réinventer la roue. Cela signifie également qu’un grand nombre de ces solutions sont utilisées depuis longtemps et qu’elles ont donc déjà été bien testées, comprises et documentées.

Outils de build et gestion des dépendances

Il est loin le temps où un pauvre développeur (comme moi !) devait chercher sur Internet un fichier JAR inconnu contenant une classe apparemment requise pour le code qu’il essaye d’exécuter. Maven et Gradle ont particulièrement facilité la génération et le déploiement d’une application, mais aussi la mise en place d’un projet de manière standard avec toutes les dépendances requises. Il est facile de commencer à coder dans un projet nouveau ou existant. Les référentiels publics comme Maven Central et Bintray simplifient la recherche et la publication de bibliothèques.

JUnit et les tests automatisés

JUnit a été créé en 1997, il est donc presque aussi vieux que Java !C’est de loin le framework de tests automatisés le plus répandu dans le monde de Java, et dans la mesure où l’on suppose qu’un framework de test est nécessaire pour tout nouveau projet Java, JUnit et TestNG sont tous les deux fournis avec IntelliJ IDEA. Il est fort probable que les frameworks de tests modernes pour de nombreux langages soient basés sur les idées de JUnit, que nous considérons aujourd’hui comme des évidences. La culture de la communauté Java en matière de tests automatisés doit beaucoup à cette seule bibliothèque.

EDI

Que vous estimiez que la verbosité de Java nécessite un EDI, ou que Java puisse réellement tirer parti d’un EDI en raison de son typage statique, le fait est que les développeurs Java aiment tout particulièrement les EDI. L’utilisation efficace d’un EDI (qu’il s’agisse d’IntelliJ IDEA, d’Eclipse ou de NetBeans) peut considérablement améliorer la productivité d’un développeur, grâce à la saisie semi-automatique, la génération de code, l’exécution de tests, le débogage, la navigation et un , entre autres fonctionnalités. Les développeurs Java sont généralement très enthousiastes quant aux avantages que peut leur apporter un EDI.

Communauté

La communauté Java est une communauté importante, mature, dynamique et accueillante. Il existe des groupes d’utilisateurs Java dans de nombreuses villes du monde, mais aussi un groupe d’utilisateurs Java virtuel. Les Java Champions sont des leaders techniques reconnus dans le monde de Java, qui se sont fait connaître en partageant des connaissances utiles pour les développeurs Java et JVM. Java a une énorme communauté open source, incluant le JDK lui-même via OpenJDK. La communauté Java valorise l’apprentissage, l’enseignement et l’amélioration constante, se soucie des standards et des bonnes pratiques et les applique de façon pragmatique.

L’aspect humain

Lorsque j’ai demandé aux développeurs ce qu’ils appréciaient le plus à propos de Java, beaucoup d’entre eux ont spécifiquement cité des personnes du monde de Java qui les ont influencés. Il s’agit de collègues, de professeurs, mais aussi de personnes telles que Brian Goetz, Angie Jones, Georges Saab, Mala Gupta, Venkat Subramaniam. Certaines personnes ont même parlé de moi. Personnellement, j’ai initialement rejoint le monde de Java car j’ai appris ce langage à l’université et qu’il donnait accès de nombreuses opportunités d’emploi, mais ce sont les personnes qui en font partie, et l’aide et le soutien qu’elles m’ont apportés, qui m’ont fait rester.

Javadoc et documentation

Java fait de la documentation de l’API un élément essentiel du langage via Javadoc. Les trois différents types de commentaires (Javadoc, bloc et ligne) montrent clairement quel type de commentaire un développeur laisse. Javadoc encourage les développeurs à laisser une documentation utile aux autres développeurs qui appellent une méthode, ou utilisent une classe ou un package. Si un développeur ne peut pas trouver d’informations détaillées sur une bibliothèque ou un fragment de code, il existe généralement un Javadoc qui peut le mettre sur la bonne voie.

De plus, l’écosystème Java semble généralement attendre (et fournir) une documentation de bonne qualité pour les développeurs. Les participants à des projets open source sont encouragés à répondre aux demandes de commentaires Javadoc ou de documentation, et les développeurs du monde entier posent des questions et y répondent sur StackOverflow, ou rédigent des articles sur des solutions à des problèmes spécifiques.

Open source

Non seulement la communauté Java a adopté l’open source très tôt, mais maintenant le JDK lui-même est également open source via OpenJDK. L’open source facilite la participation et la collaboration entre les différents distributeurs et avec les particuliers. Il est également passionnant de pouvoir observer le code de Java lui-même. Le code open source offre une formidable opportunité aux développeurs de tirer profit de l’expérience de personnes ayant travaillé dur pour étudier et résoudre des problèmes complexes.

Gratuité

La plateforme Java et de nombreux outils parmi les plus populaires utilisés dans l’écosystème Java sont accessibles gratuitement aux développeurs comme aux organisations. Même après avoir modifié son modèle de licences et son support avec Java 11, Oracle (et de nombreux autres distributeurs) a continué à fournir un moyen d’utiliser le langage gratuitement en production. Les projets open source, outils de build et EDI mentionnés dans cet article sont gratuits ou disposent aussi d’une version gratuite pour ceux d’entre eux qui sont payants. Cela rend Java particulièrement attrayant pour les développeurs qui se lancent et pour les organisations qui ne disposent pas d’un gros budget.

Langage orienté objet

La programmation orientée objet n’est bien sûr pas la seule pratique valable et chaque paradigme a ses avantages et ses inconvénients. Java a été conçu comme un langage OO dès le début, et de nombreux exemples de modèles de conception et d’autres bonnes pratiques de codage OO sont mis en évidence dans Java. Si vous recherchez un langage de programmation orienté objet, Java devrait figurer en haut de votre liste des langages à essayer.

Évolution et adaptation

Java était et reste un langage de programmation orienté objet. Mais il a également adopté avec succès certains concepts de la programmation fonctionnelle (comme les expressions lambda et les structures de données immuables) et les a bien adaptés au paradigme OO. L’inférence de type (par exemple var) nous permet de conserver les avantages d’un langage typé statiquement, mais avec moins d’artifices. L’informatique est une discipline encore relativement jeune, mais à mesure que nous apprenons des choses, nous pouvons les appliquer à nos outils existants. Java (le langage mais aussi l’écosystème) évolue constamment en fonction des nouvelles tendances et bonnes pratiques, et aussi en observant le fonctionnement des choses dans le monde réel.

Java bénéficie également de la syntaxe et des idées d’autres langages de la JVM, ce qui permet de voir ce qui fonctionne ou non dans un univers Java classique. Même les processus et outils que Java utilise pour continuer d’évoluer, comme le JCP et OpenJDK, s’adaptent pour rester en phase avec cette évolution constante. Cette évolution et cette adaptation font partie de l’équilibre que Java doit trouver.

Focus sur la lisibilité

Le code Java est souvent lisible, même pour les programmeurs n’utilisant pas ce lanagage. Le langage tend à être plus expressif plutôt que trop concis, ce qui facilite la compréhension lors de la lecture. Les développeurs du langage n’ont pas mis en place de fonctionnalités telles que la surcharge d’opérateur, car ils estiment qu’il est important de ne pas être surpris par un comportement personnalisé inattendu. Il y a une tendance à éviter la “magie”, dans le langage comme dans les frameworks. Bien que certains frameworks utilisent des concepts tels que Convention plutôt que configuration pour faire des choses sans qu’un développeur ait à s’en occuper impérativement, on s’éloigne (par exemple) de la pratique de l’AOP avec des annotations, pour se tourner davantage vers l’utilisation d’annotations pour la documentation et les contrôles d’analyse statique. La communauté et l’écosystème ont tendance à aimer les standards et les bonnes pratiques, de sorte que le code Java suit souvent des règles similaires sur des projets très différents.

Fonctionnalités du langage

Nous avons abordé 23 choses que nous aimons à propos de Java mais n’avons pas mentionné une seule fonctionnalité ! En effet, nous limiter à seulement 25 fonctionnalités nous semblait extrêmement difficile et la plupart des choses que nous aimons dans Java ne sont pas forcément liées à la syntaxe ou aux fonctionnalités. Nous souhaitons tout de même citer quelques-unes des fonctionnalités préférées des développeurs :

  • API Collections : cela fait longtemps qu’elle est avec nous et elle nous a été très utile !
  • Méthodes pratiques de fabrication pour les collections : facilite grandement la création de collections non modifiables.
  • API Streams : un très bel ajout à l’API Collections, qui est en évolue constamment depuis Java 8. Les flux parallèles ont ajouté une nouvelle façon d’utiliser les équipements modernes.
  • Expressions lambda : très pratiques et utiles, particulièrement avec l’API Streams.
  • Optional : une belle façon d’exprimer qu’une méthode pourrait ne pas vous donner quelque chose (et nous évite d’avoir à nous protéger contre les NullPointerException !). Et nous sommes toujours ravis de découvrir chaque amélioration apportée à Optional depuis Java 8.
  • java.time : la dernière API pour travailler avec les dates et les heures est une amélioration bienvenue.
  • Exceptions vérifiées : les avis sont partagés entre les exceptions vérifiées et les exceptions d’exécution, mais les exceptions vérifiées sont au moins là pour les personnes qui souhaitent les utiliser.
  • Annotations : les annotations sont (entre autres choses) comme de la documentation que le compilateur peut vérifier ou des notes pour un framework afin de réaliser un gros travail.
  • JShell : on peut maintenant s’amuser avec Java dans un REPL
  • var : l’inférence de type permet de “réduire le bruit” du code si elle est utilisée de manière judicieuse.
  • Modificateurs d’accès et modularité : Java permet (et encore plus depuis Java 9) d’être explicite sur le code qui peut accéder à tel ou tel champ, méthode, classe et module.
  • Expressions Switch : maintenant si on utilise Switch, c’est beaucoup moins moche !
  • NullPointerExceptions utiles : qui n’aime pas une bonne NullPointerException ? Désormais, les exceptions donnent aux développeurs des informations beaucoup plus utiles sur ce qui était null.
  • Fonctionnalités en prévisualisation : on adore les fonctionnalités en prévisualisation ! Nous sommes très enthousiastes concernant les enregistrements, la reconnaissance de schémas pour instanceof et les blocs de texte.

L’avenir

De nouvelles fonctionnalités sont disponibles tous les six mois et chaque nouvelle version LTS offre généralement de meilleures performances à toute application qui l’utilise. Java 15, prévu pour septembre 2020, devrait proposer : les classes cachées, les blocs de texte, la mise à jour des previews pour les Records, le filtrage par motif pour instanceof, ainsi qu’une preview de classes scellées.

Plus tard, nous espérons également voir, entre autres : une utilisation simple et légère avec Project Loom, les types inline avec Project Valhalla, plus de modifications du langage avec Project Amber, telles que les restes de lambda, que Project Panama permette aux programmeurs d’accéder plus facilement aux API étrangères, des temps de démarrage plus courts grâce à Project Leydon, de nouvelles améliorations pour les différents garbage collectors.

L’avenir est prometteur pour Java !

Auteur de l’article original en anglais : Trisha Gee