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 ?
Réponses
Trop de publicités?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.
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.
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.
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).
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.