fév.
2009
Java : plaidoyer pour un mot-clé "packaged"
En Java, il existe 4 niveaux de visibilité, dont 3 seulement possèdent un mot-clé : public
, protected
, et private
. Le 4° est la visibilité "package", qui est appliquée par défaut lorsqu'aucun mot-clé n'est spécifié.
Et c'est bien le problème : l'absence de mot-clé indique-t-elle la volonté du développeur de restreindre la visibilité de l'élément à son package, ou traduit-elle un simple oubli ?
Dans la pratique, la visibilité "package" est surtout utilisée dans deux situations :
- Lors de l'écriture d'un framework, où il peut être intéressant d'accorder aux autres éléments du framework un droit d'accès privilégié à certains détails d'implémentation. Il s'agit alors d'un risque calculé, car en principe les utilisateurs du framework ne placeront jamais leurs propres classes dans le même package ; la sécurité de l'encapsulation n'est donc pas compromise.
- Pour faciliter l'écriture de tests unitaires : c'est la solution la plus simple pour leur donner accès aux méthodes (internes) à tester.
Dans un cas comme dans l'autre, les développeurs ont pris l'habitude d'expliciter leur intention :
/* package */ void myMethod()
Dans ce cas, pourquoi ne pas officialiser cet état de fait en introduisant un mot-clé packaged
? (package
étant déjà pris...)
Parfois, moins de convention et plus de configuration explicite permettent d'éviter beaucoup de confusion, notamment chez les développeurs juniors.
Qu'en pensez-vous ?
Commentaires
Je ne suis pas d'accord. Il s'agit juste d'une bonne habitude à prendre...d'autant que pour des raisons historiques, l'ancienne convention a de fortes chances d'être maintenue, rendant caduque la nouvelle notation...
De la même manière, avant Java5, certains spécifiaient le type de leurs collections comme ceci :
public List /* String */ myWords;
Certes, on peut continuer à utiliser cette convention, mais la notation introduite avec Java 5 offre au moins l'avantage de la standardiser, même chez les développeurs juniors. La lisibilité et la clarté du code n'en sont que meilleures.
Du coup, pourquoi ne pas appliquer cela au 4° modificateur de visibilité ? Le mot-clé
packaged
pourrait, par exemple, être optionnel (pour des raisons de rétro-compatibilité notamment), mais il aurait au moins le mérite d'exister, offrant au développeur un moyen standard d'exprimer son intention dans les deux cas que j'ai présentés.Autre solution : interdire la visibilité "package" par un outil d'analyse statique de code (du genre CheckStyle ou FindBugs dans Eclipse, ou directement dans l'EDI d'IntelliJ IDEA), et utiliser la visibilité "protected" quand on a besoin de laisser la visibilité d'un attribut ou d'une méthode aux autres classes du package (puisque, comme vous le savez certainement tous, en Java, la visibilité "protected" s'étend à toutes les autres classes du même package *et* à toutes les sous-classes de la classe courante quel que soit leur package).
Interdire carrément la visibilité package, ce n'est pas un peu extrême ? Il y a quand même des cas où "protected" est trop permissif...
Par contre, faire en sorte que les outils d'analyse statique émettent un warning en cas d'absence de modificateur de visibilité, ça semble intéressant. Et du coup, le mot-clé
packaged
prendrait tout son sens.On peut se débrouiller sans ajouter un mot-clé, mais plutôt une annotation dédiée (ou un @SuppressWarnings("package-visibility")) : l'outil d'analyse de code n'émettrait alors de warning qu'en l'absence de cette annotation.
On pourrait effectivement faire comme ça, mais cela ne fonctionnerait pas sur le code auquel on n'a pas accès (libs, frameworks...).
Je pensais également à AspectJ, où actuellement, pour exprimer un pointcut sur une méthode de visibilité "package", il faut écrire :
execution(!private !public !protected * *(..));
Ce qui est quand même assez lourd...
Bonjour,
Je suis assez d'accord avec l'ajout du mot clef packaged, l'absence ne devrait indiqué qu'une visibilité privée. C'est quand même plus propre !!! ;)
Cordialement
Moi je suis pour l'introduction de ce mot clef et aussi pour restreindre la visibilité de protected aux classes filles seulement.
En fait revenir au tout début de java, où il était possible (je crois) de faire des méthodes avec les modifiers package et protected.
Je suis d'accord avec ptitbob