2009-10-12 16 views
15

En Java podemos importar clases individuales, así como todo el conjunto de clases (un paquete).Cualquier diferencia entre las importaciones de clase y las importaciones de paquetes en Java?

Como ejemplo

import java.util.* 

incluye

import java.util.ArrayList; 
import java.util.Date; 
import java.util.Enumeration; 
import java.util.HashSet; 
import java.util.Hashtable; 
import java.util.List; 
import java.util.Iterator; 
import java.util.Map; 

Aparte de la longitud del código, ¿hay ventajas específicas del uso de la cada enfoque de cualquier manera? ¿Asignación de memoria? ¿Actuación?

+0

Estaba a punto de preguntar esto. ¡Gracias! –

Respuesta

26

No hay ventaja de rendimiento o asignación de memoria en ninguno de los dos; ambos compilarán en el mismo bytecode.

La instrucción import es decirle al compilador dónde encontrar las clases a las que hace referencia el código fuente.

Sin embargo, existe la ventaja de importar solo por clases. Si hay una clase con exactamente el mismo nombre en dos paquetes, habrá un conflicto sobre a qué clase se hace referencia.

Un ejemplo de esto es la clase java.awt.List y la clase java.util.List.

Digamos que queremos utilizar un java.awt.Panel y un java.util.List.Si la fuente de las importaciones de los paquetes de la siguiente manera:

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

Luego, refiriéndose a la clase List va a ser ambiguo:

List list; // Which "List" is this from? java.util? java.awt? 

Sin embargo, si uno Las importaciones de manera explícita, a continuación, el resultado será:

import java.awt.Panel; 
import java.util.List; 

List list; // No ambiguity here -- it refers to java.util.List. 
+1

Buen punto. Entonces, ¿el compilador informa un error de compilación mientras compila un código con List? –

+0

Sí, el compilador le dirá con un error que el nombre 'List' es ambiguo. – Jesper

+1

N.B. Aún puede importar todo el paquete y luego anular la importación de clases individuales. En otras palabras, aún puede importar java.awt. * Y luego importar java.util.List. –

2

No existe diferencia alguna en la asignación o el rendimiento de la memoria para su aplicación; las declaraciones de importación no tienen ningún impacto en tiempo de ejecución en su programa en absoluto. Son solo instrucciones para decirle al compilador dónde (en qué paquetes) encontrar las clases.

Sin embargo, es mejor evitar la sintaxis comodín y siempre usar importaciones específicas. Hacer esto evitará un problema con respecto a la compatibilidad con versiones futuras de bibliotecas con su programa.

Supongamos que está utilizando la versión 1.0 de alguna biblioteca en su programa, y ​​lo hace import somelibrary.*;. Supongamos que su programa tiene una clase llamada X. Ahora, sale la versión 1.1 de la biblioteca y desea usarla. Supongamos que por casualidad hay una nueva clase llamada X en la versión 1.1 de la biblioteca.

Si usó la sintaxis comodín, de repente también está importando X de la biblioteca. El compilador le dará un error, porque ya hay una clase X en su programa, y ​​el compilador no puede distinguir entre su X y X de la biblioteca.

Si solo importa las clases que realmente necesita de la biblioteca, no obtendrá este problema, porque no importará automáticamente X desde la versión 1.1 de la biblioteca.

6

Las importaciones que elija utilizar solo suponen una diferencia de tiempo de compilación al resolver los nombres de las clases.

Por lo tanto, las únicas ventajas/desventajas se aplican a la legibilidad.

Solo importar el mínimo que necesita parece mejor porque alguien puede ver lo que realmente está usando. Dicho esto, el IDE probablemente maneja esto y es un punto discutible.

2

La realización de una importación explícita es más segura en tiempo de compilación, ya que no hay posibilidad de un conflicto de clase. p.ej.

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

provoca un problema si está intentando utilizar una clase de fecha (es decir, ¿de qué paquete?).

Pero aparte de eso, no hay ningún aspecto de rendimiento o memoria. Es puramente un problema de tiempo de compilación.

2

La ventaja de importar utilizando un '*' es que se trata de menos líneas de código y menos tipeo. Esto es más importante si realiza su codificación con un editor de texto "tonto" en lugar de un IDE que puede usar puntos suspensivos para ocultar las importaciones y puede agregar importaciones de forma semiautomática.

Las desventajas de importación utilizando '*' son:

  • Usted se importan conflictos de nombres de clase de vez en cuando; p.ej. cuando se utiliza un nombre de clase para las clases en diferentes paquetes y se importan ambos.
  • No puede ver las dependencias de una clase explícita mirando las importaciones. Pero esto es menos importante si su IDE puede mostrarle las dependencias de otra manera.
0

Cualquier IDE decente incluirá las declaraciones de importación para usted y muchas más. Obtenga un IDE mejor si esto es un problema para usted.

IntelliJ lo hace; también lo hace Eclipse. Yo no uso NetBeans, pero apostaría a que sí.

Cuestiones relacionadas