94 votes

Importer package.* vs importer package.SpecificType

Cela ferait-il une différence, en termes de surcharge, d'écrire un import chargeant tous les types dans un seul paquet ( import java.* ) ; plutôt que de se contenter d'un type spécifique (à savoir import java.lang.ClassLoader ) ? La seconde serait-elle plus recommandable que l'autre ?

118voto

Chris Cudmore Points 11133

Jetez un coup d'œil à l'API Java, et vous verrez de nombreuses classes et interfaces portant le même nom dans différents paquets.

Par exemple :

java.lang.reflect.Array
java.sql.Array

Donc, si vous importez java.lang.reflect.* y java.sql.* vous aurez une collision sur le type Array, et devrez les qualifier complètement dans votre code.

L'importation de classes spécifiques à la place vous évitera ce tracas.

94voto

shsteimer Points 8749

Il n'y a pas de coût de performance ou de frais généraux à importer des .* plutôt que des types spécifiques. Cependant, je considère comme une bonne pratique de ne jamais utiliser import .*. Ma raison principale est que j'aime garder les choses simples, propres et avec le moins d'ambiguïté possible, et je pense qu'avec un import .* vous perdez cela.

29voto

Scott Stanchfield Points 15863

C'est en fait un très mauvais problème.

Supposons que vous écriviez

import a.*;
import b.*;
...
Foo f;

et la classe Foo existe dans le paquet a.

Maintenant, vous vérifiez votre code parfaitement compilé, et six mois plus tard, quelqu'un ajoute la classe Foo au paquet b. (Peut-être est-ce une librairie tierce qui a ajouté des classes dans la dernière version).

Pouf ! Maintenant votre code refuse de compiler.

Jamais utiliser l'importation à la demande. C'est le mal !

Voir http://javadude.com/articles/importondemandisevil.html pour plus de détails.

Performance RE :

import a.*;

vs

import a.X;

Cela ne fait aucune différence au moment de l'exécution. Le compilateur intègre en dur les noms de classe résolus dans les fichiers .class générés.

14voto

Yar Points 25421

Opinion minoritaire : dans mon code, j'ai tendance à utiliser des tonnes de classes provenant de quelques paquets, ainsi que quelques classes bizarres ici et là. J'aime garder ma liste d'importations petite afin de pouvoir dire ce qui se passe en un coup d'œil. Pour ce faire, je fixe le seuil à 4 classes. Au-delà de ce seuil, Eclipse utilisera * pour mon code. Je trouve que cela permet de garder mes importations de paquets lisibles, et j'ai tendance à les désigner comme les la première chose que je fais quand je regarde une classe, pour répondre à la question : A qui parle-t-il ?

En ce qui concerne la collision des noms : Quelles sont les chances que vous importiez quatre classes ou plus de deux paquets qui ont des noms de classe concurrents ? Si c'est le cas dans plus de 10 % des cas, vous devriez peut-être réfléchir au nombre de paquets sur lesquels votre classe repose (par exemple, la refactoriser en classes plus petites).

9voto

VonC Points 414372

Une bonne raison de ne jamais utiliser import xxx.* est d'avoir une vision claire de Dépendances .

Vous pouvez savoir plus rapidement que vous utilisez une classe spécifique d'un autre paquetage parce qu'elle est listée juste au début du fichier source.

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