2009-10-12 24 views
15

In Java possiamo importare singole classi e l'intero set di classi (un pacchetto).Qualche differenza tra le importazioni di classe e le importazioni di pacchetti in Java?

Come esempio

import java.util.* 

include

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; 

Oltre alla lunghezza del codice, esistono vantaggi specifici dell'utilizzo di ogni approccio in qualsiasi modo? Allocazione della memoria? Prestazione?

+0

Stavo per chiedermelo. Grazie! –

risposta

26

Nessun vantaggio di allocazione della memoria o delle prestazioni: entrambi verranno compilati allo stesso bytecode.

L'istruzione import indica al compilatore dove trovare le classi a cui fa riferimento il codice sorgente.

Tuttavia, vi è un vantaggio per l'importazione solo per classi. Se c'è una classe con lo stesso identico nome in due pacchetti, ci sarà un conflitto su quale classe viene indicata.

Uno di questi esempi è la classe java.awt.List e la classe java.util.List.

Diciamo che vogliamo utilizzare uno java.awt.Panel e uno java.util.List.Se la sorgente importa i pacchetti come segue:

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

Poi, riferendosi alla classe List sta per essere ambigua:

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

Tuttavia, se uno importa esplicitamente, allora il risultato sarà:

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

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

Buon punto. Quindi il compilatore segnala un errore di compilazione durante la compilazione di un codice con List? –

+0

Sì, il compilatore ti dirà con un errore che il nome 'List' è ambiguo. – Jesper

+1

N.B. È comunque possibile importare l'intero pacchetto, quindi eseguire l'override dell'importazione delle singole classi. In altre parole, è ancora possibile importare java.awt. * Quindi importare java.util.List. –

2

Non c'è alcuna differenza nell'allocazione di memoria o nelle prestazioni per l'applicazione; le istruzioni di importazione non hanno alcun impatto in fase di esecuzione sul tuo programma. Sono solo delle direttive per dire al compilatore dove (in quali pacchetti) trovare le classi.

Tuttavia, è meglio evitare la sintassi dei caratteri jolly e utilizzare sempre importazioni specifiche. In questo modo si eviterà un problema relativo alla compatibilità con le versioni future delle librerie con il tuo programma.

Supponiamo di utilizzare la versione 1.0 di alcune librerie nel programma e di eseguire import somelibrary.*;. Supponiamo che il tuo programma abbia una classe denominata X. Ora, la versione 1.1 della libreria viene fuori e tu vuoi usarla. Supponiamo che per caso ci sia una nuova classe chiamata X nella versione 1.1 della libreria.

Se si utilizza la sintassi dei caratteri jolly, all'improvviso si importa anche X dalla libreria. Il compilatore ti darà quindi un errore, perché c'è già una classe X nel tuo programma, e il compilatore non può distinguere tra il tuo X e il X dalla libreria.

Se si importano solo le classi effettivamente necessarie dalla libreria, non si verifica questo problema, poiché non si importa automaticamente X dalla versione 1.1 della libreria.

6

Le importazioni che si sceglie di utilizzare fanno solo una differenza in fase di compilazione quando si risolvono i nomi delle classi.

Quindi gli unici vantaggi/svantaggi si applicano alla leggibilità.

L'importazione del minimo richiesto sembra essere migliore perché qualcuno può vedere quello che stai effettivamente utilizzando. Detto questo, l'IDE probabilmente lo gestisce ed è un punto controverso.

2

L'esecuzione di un'importazione esplicita è più sicura in fase di compilazione, poiché non vi è alcuna possibilità di conflitto di classe. per esempio.

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

causa un problema se si sta cercando di usare una classe Date (vale a dire da quale pacchetto?).

Ma a parte questo, non ci sono prestazioni o aspetti della memoria. È puramente un problema in fase di compilazione.

2

Il vantaggio dell'importazione utilizzando un '*' è che si tratta di un numero inferiore di righe di codice e meno di digitazione. Questo è più importante se si esegue la codifica con un editor di testi "stupido" piuttosto che con un IDE che può utilizzare le ellissi per nascondere le importazioni e aggiungere le importazioni in modo semi-automatico.

Gli svantaggi di importazione con '*' sono:

  • Si ottiene importato nome classe collisioni di tanto in tanto; per esempio. quando un nome di classe viene usato per le classi in diversi pacchetti e tu li importi entrambi.
  • Non è possibile visualizzare le dipendenze esplicite di classi osservando le importazioni. Ma questo è meno importante se il tuo IDE può mostrarti le dipendenze in un altro modo.
0

Qualsiasi IDE decente inserirà le dichiarazioni di importazione per voi e molto altro ancora. Ottieni un IDE migliore se questo è un problema per te.

IntelliJ lo fa; così fa Eclipse. Io non uso NetBeans da solo, ma scommetto che lo fa.

Problemi correlati