Chocoblog

Chocoblog

Billets sur l'informatique, les logiciels libres et retours d'utilisation sont au programme avec la possibilité de publier des billets de copains.

Pourquoi Java c'est pas ma tasse de thé

logo

Je vous laisse deux minutes pour vous rétablir de ce super jeu de mot.

...

...

C'est bon, on peut commencer.

Commençons par préciser le sujet : je ne vais pas parler d'Android ou du Java web (qui est d'ailleurs pour moi une abomination) mais plutôt du "desktop" (en version 7).

C'est parti

Lourdeur

Bon sang que c'est lourd. Quand on vient du C++/Qt, ça fait drôle. Le démarrage de l'application (Swing) est lent et fait monter le proco. Ajoutons à ça la consommation de RAM et félicitation vous avez votre chauffage pour l'hiver.

En ce qui concerne Swing, c'est vilain (OpenJDK) et lent (fait en Java trololo) surtout quand à côté t'as des applications Qt qui elles sont vraiment réactives.

Verbosité

Trop de verbosité tue la verbosité (what ?). Comment voulez-vous respecter les 80 colonnes en Java sans tronquer votre instruction en 4 ou 5 lignes ?! Les devs Java à plein temps vous usez combien de claviers par mois ?
On peut aussi ajouter la gestion obligatoire des exceptions. Alors on est pour ou contre peu importe. Mais à chaque ligne on est obligé d'ajouter un try/catch et ça ça me les brise. On se retrouve donc avec un beau code imbuvable, c'est à dire complètement à l'opposé du but initial. Bravo les gars.

Bon je suis d'accord y'a les IDE qui écrivent le code à notre place et ça facilite grandement le boulot. Ah, tiens en parlant de ça je vais pouvoir coder ma ligne, l'Eclipse que j'ai lancé la veille vient de s'ouvrir.

Le design

Java encourage l'utilisation de classes qui doivent communiquer les unes avec les autres. Du coup vous passez plus de temps à créer des nouvelles classes d'une utilité digne d'un magicarpe qu'à vraiment coder. Difficile de critiquer un choix de design, mais accumulé à la verbosité ça fait quand même sacrément mal aux doigts.

Sécurité

Java est bourré de failles de sécurité et madame michu n'a pas souvent tendance à mettre à jour le programme (quand Oracle décide d'appliquer un correctif soit après la pause café du mois suivant). Ça en fait une belle porte grande ouverte à n'importe qui (surtout aux méchants en fait).
Les failles à répétition ont même contraint Mozilla à indiquer le plugin Java comme dangereux (alors que ce n'est pas le cas avec Flash, c'est dire). Mais bon je m'éloigne du Java desktop.

Code

Venons en au plus intéressant (si vous êtes sado).

Il n'y a pas d'entiers non signés en Java. En même temps c'est connu ça ne sert à rien.

Impossibilité de passer des paramètres constants et de ce fait d'utiliser le const-correctness afin de pas faire de conneries dans une méthode. Et vu qu'avec Java on manipule que des références, on peut facilement modifier l'objet référencé et donc faire n'importe quoi. Le plus marrant dans tout ça c'est que Java intègre le mot clé const, sauf qu'il ne sert tout simplement à rien (c'est normal en Javaaaaaa).

Impossibilité d'instancier littéralement des collections, faut appeler les méthodes d'ajout successifs après avoir créé l'objet. Bah, vous allez dire on est plus à une ligne près.

Il n'est pas non plus possible de faire de surchages d'opérateur (étonnant quand on sait qu'initialement Java devait être une amélioration du C++). Y'a qu'avec les String que le "+" fonctionne (concaténation des chaînes). Pour le reste il va falloir créer des méthodes et les appeller ensuite. Trop la joie.

Il n'est pas possible de créer des sortes de pointeurs de fonctions. Ou si, mais faut bidouiller en créant une autre classe (cf la partie sur le design).

Impossibilité d'avoir des entités globales. On est obligé d'écrire des lignes et encore des lignes (pour changer) en bidouillant avec des singletons par exemple.

La généricité en Java est une blague. Je vais pas m'attarder là dessus, mais en gros son utilité est proche du 0 absolu. Voir la doc' qui explique les différentes restrictions.

Impossibilité de créer des alias pour les imports. Par exemple en ce qui concerne les Date (ahah la manipulation des dates en Java du pur bonheur), on est obligé d'écrire indéfiniment java.sql.Date à chaque déclaration de variable de ce type si on a déjà importé java.utils.Date. Ajouté à cela qu'il n'y a pas d'inférence de type (la vraie, pas celle à deux francs déjà implémenté pour la généricité), c'est que du bonheur.

Impossibilité (décidément...) de deviner le type de la variable lorque l'on l'instancie (auto en C++ par exemple), or il arrive en Java d'avoir des noms de classes relativement longs (cf point précédent).

Pas d'héritage multiple. Et surtout commencez pas à me parler des interfaces. On parle au niveau du développement. Et je suis désolé mais les interfaces ça simule l'héritage multiple au prix de nombreuses lignes et de duplication de code.
Et ne me dites pas que l'héritage multiple ne doit pas exister, ça peut causer des problèmes mais c'est nécessaire et difficilement évitable.

Garbage collector

C'est cool le garbage, ça vous empêche de vous soucier de la mémoire. Vous programmez donc comme un sale (en Java quoi) sans savoir de combien de mémoire vous disposez ni de combien de mémoire est gérée. Puis le GC arrive la fleur au fusil pour faire le ménage. Sur le papier ça parait intéressant. Sauf que quand il débarque alors que vous avez manipulé pas mal de mémoire autant dire que le résultat est marrant.

Destructeur

Pas de destructeur, on est obligé de simuler ça avec un finalize. Seulement on ne sait pas quand le GC viendra détruire l'objet ce qui peut poser des problème lorsqu'on veut faire les choses de façon élégantes (oui y'en a qui essayent encore). De plus on rajoute du boulot au GC (comme si il avait besoin de ça). Du coup il est plutôt conseillé de créer une méthode qui s'occupera de fermer toutes les connexions diverses et variées ouvertes par l'objet par exemple, et d'utiliser finalize pour vérifier que ces connexion sont bien fermées. Sexy.

Oracle

Quand on voit la position d'Oracle vis à vis du logiciel open-source, de la façon dont ils traitent les contributeurs, du fiasco de la gestion d'OpenOffice, du fork de MySQL par Michael Wideniuset après ses inquiétudes à la suite du rachat de Sun et de la démission de James Gosling (bon ok peut être que ça n'a rien à voir), moi je dis que le fait que Java est dev/maintenu par Oracle pue. Et pour courronner le tout on a le droit à un bel adware bundle avec les version Windows et Mac (si ma mémoire est correcte).

Conclusion

Bon hé bien je crois que j'ai fais le tour. Je sais pas vous, mais moi ça m'a fait du bien.

Sinon pour finir sur une note positive y'a Groovy qui m'a l'air vraiment pas mal et qui pallie à pas mal des défauts cités ci-dessus (merci Augier). Un autre petit merci à Arslen pour l'image d'illustration (on se croirait aux Oscars).

N'hésitez à me signaler des erreurs ou à tout simplement m'insulter (oui j'aime ça) par mail/commentaire.

Et enfin petit cadeau pour la fin http://whyjavasucks.com/.