561 votes

Pourquoi utiliser un caractère générique avec une instruction d'importation Java incorrecte?

Il est beaucoup plus pratique et plus propre d'utiliser une seule déclaration comme

 import java.awt.*;
 

que d'importer un tas de classes individuelles

 import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...
 

Quel est le problème avec l'utilisation d'un caractère générique dans l'instruction import ?

689voto

Benjamin Pollack Points 10458

Le seul problème c'est qu'il encombre votre espace de noms local. Par exemple, disons que vous êtes en train de rédiger un Swing application, et donc le besoin de java.awt.Event, et sont également l'interfaçage avec la société du système d'agenda, qui a com.mycompany.calendar.Event. Si vous importez à la fois en utilisant le caractère générique de la méthode, l'une des deux choses suivantes se produit:

  1. Vous avez carrément une dénomination conflit entre java.awt.Event et com.mycompany.calendar.Event, et donc vous ne pouvez même pas compiler.
  2. En fait vous ne gérez qu'à importer un seul de vos deux importations n' .*), mais c'est le mauvais, et vous avez du mal à comprendre pourquoi votre code demande le type est mauvais.
  3. Lorsque vous compilez votre code il n'y a pas d' com.mycompany.calendar.Event, mais plus tard, quand elles ajouter l'un de vos cours jusqu'à présent code s'arrête soudainement de la compilation.

L'avantage d'une liste explicite de toutes les importations, c'est que je peux voir en un coup d'œil la classe que vous vouliez utiliser, ce qui rend la lecture du code beaucoup plus facile. Si vous êtes juste de faire un rapide one-off chose, il n'y a rien explicitement mal, mais les futurs responsables vous remercie pour votre clarté autrement.

246voto

davetron5000 Points 9622

Voici un vote pour la star des importations. Une instruction d'importation est prévu d'importer un package, pas une classe. Il est beaucoup plus propre à l'importation ensemble de paquets; les problèmes identifiés ici (par exemple, java.sql.Date vs java.util.Date) sont facilement corrigées par d'autres moyens, pas vraiment abordé par des importations, et certainement pas justifier incroyablement pédant importations sur toutes les classes. Il n'y a rien de plus déconcertant que l'ouverture d'un fichier source et d'avoir à parcourir des 100 déclarations d'importation.

Faire importations spécifiques rend refactoring plus difficile; si vous supprimer/renommer une classe, vous devez supprimer tous ses importations spécifiques. Si vous passez d'une application à une autre classe du même package, vous devez aller de fixer les importations. Bien que ces étapes supplémentaires qui peuvent être automatisés, ils sont vraiment de la productivité des hits pour aucun gain réel.

Si Eclipse ne fait pas de la classe des importations par défaut, tout le monde serait encore de faire de l'étoile importations. Je suis désolé, mais il n'y a vraiment pas de justification rationnelle pour faire des importations spécifiques.

Voici comment composer avec les conflits de classe:

import java.sql.*;
import java.util.*;
import java.sql.Date;

227voto

Scott Stanchfield Points 15863

veuillez voir mon article d'Importation sur la Demande est Mal

En bref, le plus gros problème, c'est que votre code peut casser quand une classe est ajoutée à un package que vous importez. Par exemple:

import java.awt.*;
import java.util.*;

// ...

List list;

En Java 1.1, c'était très bien; Liste a été trouvé dans java.awt et il n'y a pas de conflit.

Maintenant, supposons que vous vérifiez dans votre parfaitement code de travail, et un an plus tard, quelqu'un d'autre, il met en évidence pour la modifier, et est à l'aide de Java 1.2.

Java 1.2 ajout d'une interface nommée Liste de java.util. BOOM! Les conflits. La parfaitement de travail code ne fonctionne plus.

C'est un MAL pour le langage. Il n'y a PAS de raison que le code devrait arrêter la compilation juste parce qu'un type est ajouté à un package...

En outre, il est difficile pour un lecteur de déterminer les "Foo" vous êtes en utilisant.

88voto

hwiechers Points 4717

C'est pas mal de l'utiliser d'une wild-card, avec un Java instruction import.

Dans le Code Propre, Robert C. Martin effectivement recommande de les utiliser afin d'éviter les longues listes d'importation.

Voici la recommandation:

J1: Éviter les Longues Listes d'Importation en Utilisant Les caractères génériques

Si vous utilisez deux ou plusieurs classes à partir d'un paquet, puis les importer l'ensemble du paquet avec

importer le package.*;

De longues listes d'importations sont redoutables pour le reader. Nous ne voulons pas encombrer les sommets de nos modules avec 80 les lignes des importations. Nous voulons plutôt l' les importations d'un exposé concis sur les paquets qui nous collaborons avec.

Importations spécifiques sont dur dépendances, tandis que les importations de génériques ne le sont pas. Si vous importez un classe, alors que la classe doit exister. Mais si vous importez un paquet avec un générique, pas en particulier les classes ont besoin pour exister. L'instruction import simplement ajoute le paquet dans le chemin de recherche lors de la chasse pour les noms. Donc, pas vrai la dépendance est créée par ces importations, et par conséquent, ils servent à garder notre les modules de moins couplée.

Il ya des moments où la longue liste de importations spécifiques peuvent être utiles. Pour exemple, si vous traitez avec code héritage et que vous voulez découvrir ce que les classes que vous avez besoin pour construire des objets fantaisie et les talons, vous pouvez marcher dans la liste des importations spécifiques pour en savoir le vrai qualifié les noms de tous ceux classes et puis la les talons en place. Cependant, cette utilisation de l' spécifique des importations est très rare. En outre, la plupart des Ide modernes seront vous permettent de convertir l'un caractère astérisque les importations de la liste des importations avec une seule commande. Donc, même dans le héritage cas, il est préférable d'importer les caractères génériques.

Générique les importations peuvent parfois causer des les conflits de nom et d'ambiguïtés. Deux les classes avec le même nom, mais dans différents forfaits, devront être spécialement importés, ou au moins spécialement qualifiée lors de son utilisation. Cette peut être une nuisance, mais est assez rare que l'utilisation générique des importations est encore généralement mieux que spécifique les importations.

28voto

hazzen Points 7315

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:

 import java.util.*;
import java.awt.*;

...
List blah; // Ambiguous, needs to be qualified.
 

Cela permet également de concrétiser vos dépendances, car toutes vos dépendances sont listées en haut du fichier.

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