12 votes

Paramètre de type ou caractère générique non limité

Extrait du chapitre 5 de Effective Java (génériques) :

// Two possible declarations for the swap method
public static <E> void swap(List<E> list, int i, int j);
public static void swap(List<?> list, int i, int j);

Laquelle de ces deux déclarations est préférable, et pourquoi ? Dans une API publique, la seconde est préférable car elle est plus simple. Vous transmettez une liste - n'importe quelle liste - et la méthode échange les éléments indexés. Il n'y a pas de paramètre de type à prendre en compte. En règle générale, si un paramètre de type n'apparaît qu'une seule fois dans une déclaration de méthode, remplacez-le par un joker.

Je ne comprends pas pourquoi la deuxième option est plus simple pour le client de mon API ? Je peux passer les mêmes paramètres à la première et à la deuxième méthode. De plus, la deuxième méthode nécessite une méthode d'aide pour la capture de caractères génériques. Quelqu'un pourrait-il m'expliquer pourquoi la seconde est recommandée ? Merci !

11voto

xwoker Points 1523

La FAQ sur les génériques Java est une excellente source pour répondre à ce type de questions. La question de la comparaison entre les génériques et les caractères génériques est abordée en détail dans le document suivant Laquelle est la meilleure : une méthode générique avec des paramètres de type ou une méthode non générique avec des caractères génériques ? et les études de cas qui en découlent.

Angelika Langer en arrive à la conclusion :

Conclusion : Dans tous ces exemples, c'est surtout une question de goût et de style, que vous préfériez la version générique ou la version avec caractères génériques. Il y a généralement un compromis entre la facilité de mise en œuvre (la version générique est souvent plus facile à mettre en œuvre) et la complexité de la signature (la version wildcard a moins de paramètres de type ou n'en a pas du tout).

Signature de méthode plus simple -> plus facile à comprendre (même si les deux méthodes sont utilisées de la même manière) -> bon dans l'API publique (contrepartie : implémentation plus complexe)

Mais tout cela est une question de légèreté et, d'après mon expérience, la cohérence de l'ensemble de l'API est bien plus importante que le style que vous utilisez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X