Le seul problème est qu'il encombre votre espace de noms local. Par exemple, disons que vous écrivez une application Swing, et donc que vous en avez besoin java.awt.Event
, et que vous vous connectez également au système de calendrier de l'entreprise, qui l'a com.mycompany.calendar.Event
. Si vous importez les deux à l'aide de la méthode générique, l'une des trois choses suivantes se produit:
- Vous avez un conflit de dénomination entre
java.awt.Event
et com.mycompany.calendar.Event
et vous ne pouvez donc même pas compiler.
- En fait, vous ne parvenez à en importer qu'une seule (une seule de vos deux importations le fait
.*
), mais ce n'est pas la bonne, et vous avez du mal à comprendre pourquoi votre code prétend que le type est incorrect.
- Lorsque vous compilez votre code, il n'y en a pas
com.mycompany.calendar.Event
, mais lorsqu'ils en ajoutent plus tard, votre code précédemment valide cesse soudainement de compiler.
L'avantage de répertorier explicitement toutes les importations est que je peux dire en un coup d'œil quelle classe vous vouliez utiliser, ce qui facilite simplement la lecture du code. Si vous faites juste une chose ponctuelle rapide, il n'y a rien de mal explicitement , mais les futurs responsables vous remercieront pour votre clarté sinon.
Benjamin Pollack
la source
Voici un vote pour les importations d'étoiles. Une instruction import est destinée à importer un package , pas une classe. Il est beaucoup plus propre d'importer des packages entiers; les problèmes identifiés ici (par exemple
java.sql.Date
vsjava.util.Date
) sont facilement résolus par d'autres moyens, pas vraiment traités par des importations spécifiques et ne justifient certainement pas les importations incroyablement pédantes sur toutes les classes. Il n'y a rien de plus déconcertant que d'ouvrir un fichier source et d'avoir à parcourir 100 instructions d'importation.Faire des importations spécifiques rend la refactorisation plus difficile; si vous supprimez / renommez une classe, vous devez supprimer toutes ses importations spécifiques. Si vous basculez une implémentation vers une classe différente dans le même package, vous devez aller corriger les importations. Bien que ces étapes supplémentaires puissent être automatisées, ce sont vraiment des gains de productivité sans gain réel.
Même si Eclipse ne faisait pas d'importations de classe par défaut, tout le monde ferait toujours des importations d'étoiles. Je suis désolé, mais il n'y a vraiment aucune justification rationnelle pour effectuer des importations spécifiques.
Voici comment gérer les conflits de classe:
la source
Foo
, et si je lis votre code sans utiliser un IDE (puisque votre argument est que je ne devrais pas avoir à en utiliser un), comment saurai-je de quel paquetFoo
provient ? Bien sûr, en utilisant un IDE, l'IDE me le dira, mais tout votre argument est que je devrais être capable de lire le code sans un. Les importations explicites aident à documenter le code (une excellente raison d'éviter les caractères génériques) , et il est beaucoup plus probable que je lise le code sans utiliser un IDE, que que j'écris le code sans utiliser un IDE.s'il vous plaît voir mon article Import on Demand is Evil
En bref, le plus gros problème est que votre code peut se casser lorsqu'une classe est ajoutée à un package que vous importez. Par exemple:
En Java 1.1, c'était bien; La liste a été trouvée dans java.awt et il n'y a pas eu de conflit.
Supposons maintenant que vous archiviez votre code parfaitement fonctionnel et qu'un an plus tard, quelqu'un d'autre le fasse sortir pour l'éditer et utilise Java 1.2.
Java 1.2 a ajouté une interface nommée List à java.util. BOOM! Conflit. Le code fonctionnant parfaitement ne fonctionne plus.
Il s'agit d'une fonction de langage EVIL . Il n'y a AUCUNE raison pour que le code arrête de compiler juste parce qu'un type est ajouté à un package ...
De plus, il est difficile pour un lecteur de déterminer quel "Foo" vous utilisez.
la source
java.util.List
vsjava.awt.List
n'est pas trop mal à comprendre, mais essayez-le lorsque le nom de la classe estConfiguration
et que plusieurs bibliothèques de dépendances l'ont ajouté dans leur dernière version de référentiel maven.Il n'est pas mauvais d'utiliser un caractère générique avec une instruction d'importation Java.
Dans Clean Code , Robert C. Martin recommande en fait de les utiliser pour éviter les longues listes d'importation.
Voici la recommandation:
la source
Performances : aucun impact sur les performances car le code d'octet est identique. même si cela entraînera des frais généraux de compilation.
Compilation : sur ma machine personnelle, Compiler une classe vide sans rien importer prend 100 ms mais la même classe lors de l'importation java. * Prend 170 ms.
la source
import java.*
n'importe rien. Pourquoi cela ferait-il une différence?Il encombre votre espace de noms, vous obligeant à spécifier complètement tous les noms de classe qui sont ambigus. L'occurrence la plus courante de ceci est avec:
Cela permet également de concrétiser vos dépendances, car toutes vos dépendances sont répertoriées en haut du fichier.
la source
La plupart des endroits où j'ai travaillé qui utilisent une quantité importante de Java font des importations explicites une partie de la norme de codage. Parfois, j'utilise toujours * pour le prototypage rapide, puis j'élargis les listes d'importation (certains IDE le feront également pour vous) lors de la production du code.
la source
Je préfère les importations spécifiques, car cela me permet de voir toutes les références externes utilisées dans le fichier sans regarder l'ensemble du fichier. (Oui, je sais que cela ne montrera pas nécessairement des références pleinement qualifiées. Mais je les évite autant que possible.)
la source
Dans un projet précédent, j'ai constaté que le passage de * -importations à des importations spécifiques réduisait le temps de compilation de moitié (d'environ 10 minutes à environ 5 minutes). L'import * * oblige le compilateur à rechercher dans chacun des packages répertoriés une classe correspondant à celle que vous avez utilisée. Bien que ce temps puisse être petit, il s'additionne pour les grands projets.
Un effet secondaire de l'importation * était que les développeurs copiaient et collaient les lignes d'importation courantes plutôt que de penser à ce dont ils avaient besoin.
la source
Dans le livre DDD
Et s'il encombre l'espace de noms local, ce n'est pas votre faute - blâmez la taille du paquet.
la source
Il n'y a aucun impact sur l'exécution, car le compilateur remplace automatiquement * par des noms de classe concrets. Si vous décompilez le fichier .class, vous ne verriez jamais
import ...*
.C # utilise toujours * (implicitement) car vous ne pouvez
using
empaqueter que le nom. Vous ne pouvez jamais spécifier le nom de la classe. Java introduit la fonctionnalité après c #. (Java est tellement délicat à bien des égards, mais il dépasse ce sujet).Dans Intellij Idea, lorsque vous "organisez les importations", il remplace automatiquement plusieurs importations du même package par *. Il s'agit d'une fonction obligatoire car vous ne pouvez pas la désactiver (bien que vous puissiez augmenter le seuil).
Le cas répertorié par la réponse acceptée n'est pas valide. Sans * vous avez toujours le même problème. Vous devez spécifier le nom de la pakcage dans votre code, que vous utilisiez * ou non.
la source
Pour mémoire: lorsque vous ajoutez une importation, vous indiquez également vos dépendances.
Vous pouvez voir rapidement quelles sont les dépendances des fichiers (à l'exclusion des classes du même espace de noms).
la source
Le plus important est que l'importation
java.awt.*
peut rendre votre programme incompatible avec une future version Java:Supposons que vous ayez une classe nommée "ABC", vous utilisez JDK 8 et vous importez
java.util.*
. Supposons maintenant que Java 9 sorte et qu'il ait une nouvelle classe dans le packagejava.util
qui, par coïncidence, se nomme également "ABC". Votre programme ne compilera plus sur Java 9, car le compilateur ne sait pas si avec le nom "ABC" vous voulez dire votre propre classe ou la nouvelle classejava.awt
.Vous n'aurez pas ce problème lorsque vous importerez uniquement les classes explicitement à partir de celles
java.awt
que vous utilisez réellement.Ressources:
Importations Java
la source
Stream
comme exemple d'une nouvelle classe ajoutée en Java dans java.util en Java 8 ...Parmi tous les points valables formulés des deux côtés, je n'ai pas trouvé ma principale raison d'éviter le caractère générique: j'aime pouvoir lire le code et savoir directement ce qu'est chaque classe, ou si sa définition n'est pas dans la langue ou le fichier, où le trouver. Si plusieurs packages sont importés avec *, je dois rechercher chacun d'eux pour trouver une classe que je ne reconnais pas. La lisibilité est suprême et j'accepte que le code ne nécessite pas d' IDE pour le lire.
la source