2015-10-06 13 views
7

Esistono differenze che utilizzano una "importazione in linea" (un nome completo) e un'importazione normale in termini di prestazioni, memoria, tempo di compilazione e così via in Java?Differenza tra l'utilizzo del nome completo e l'importazione in Java

chooser.setCurrentDirectory(new java.io.File(".")); 

e

import java.io.File; 
... 
    chooser.setCurrentDirectory(new File(".")); 
+4

Non c'è differenza, solo la seconda soluzione è più leggibile. Dovresti usare solo "importazioni in linea" se c'è un conflitto di classi altrimenti. – hotzst

+1

Ti suggerirei di utilizzare il secondo per una migliore leggibilità. E preoccupati delle prestazioni quando hai misurazioni su ciò che si comporta male. – Kuchi

risposta

9

La cosa principale su cui concentrarsi è la leggibilità. Trovo il secondo più leggibile.

In rari casi, preferisco il secondo approccio. Consideriamo il seguente scenario: Per qualche ragione, ho scritto un corso e lo ho chiamato File. Ho digitato File file = new File(...) e il mio IDE ha importato automaticamente lo java.io.File per me. Ma non voglio quel tipo di oggetto, voglio la classe myFile. Quindi, invece di importare la classe corretta, preferisco l'importazione in-line, solo che gli altri utenti non verranno confusi con la classe File di Java.

Per quanto riguarda le prestazioni, sono esattamente lo stesso, ed ecco la prova -

Questo è il bytecode generato per il primo frammento:

public class java8.tests.General { 
    public java8.tests.General(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: new   #2     // class javax/swing/JFileChooser 
     3: dup 
     4: invokespecial #3     // Method javax/swing/JFileChooser."<init>":()V 
     7: astore_1 
     8: aload_1 
     9: new   #4     // class java/io/File 
     12: dup 
     13: ldc   #5     // String . 
     15: invokespecial #6     // Method java/io/File."<init>":(Ljava/lang/String;)V 
     18: invokevirtual #7     // Method javax/swing/JFileChooser.setCurrentDirectory:(Ljava/io/File;)V 
     21: return 
} 

Questo è il bytecode per la seconda :

public class java8.tests.General { 
    public java8.tests.General(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: new   #2     // class javax/swing/JFileChooser 
     3: dup 
     4: invokespecial #3     // Method javax/swing/JFileChooser."<init>":()V 
     7: astore_1 
     8: aload_1 
     9: new   #4     // class java/io/File 
     12: dup 
     13: ldc   #5     // String . 
     15: invokespecial #6     // Method java/io/File."<init>":(Ljava/lang/String;)V 
     18: invokevirtual #7     // Method javax/swing/JFileChooser.setCurrentDirectory:(Ljava/io/File;)V 
     21: return 
} 
4

No entrambi sono esattamente uguali in termini di prestazioni, la memoria, a tempo di compilazione. L'unica differenza tra loro è che la normale importazione salva gli sforzi di digitazione ed è più leggibile che sia.

2

Se si sta importando le classi della stesso nome in una classe, si è in grado di dire esplicitamente quale usare dove (nome di classe completo):

import java.io.File; 
... 
chooser.setCurrentDirectory(new File(".")); // java.io.File 

new org.yourpackage.File("sdfsdf");   // org.yourpackage.File 
2

No, è wouldn' t influenza le prestazioni del tuo codice. Le istruzioni di importazione rendono il tuo codice più leggibile perché non stai scrivendo tutto il nome del pacchetto. Ma a volte, si verifica un conflitto di ClassName, quindi è consigliabile utilizzare nomi qualificati.

1

Nelle classi java viene sempre fatto riferimento tramite il proprio nome completo nel bytecode finale. Succede la prima volta che viene creato un oggetto di classe (o si accede a un membro statico della classe).

Detto questo, import viene utilizzato dal compilatore per accedere alle classi con il loro nome non qualificato (MyClass anziché mypackage.MyClass).

Quindi c'è una differenza 0 tra l'importazione della classe o la scrittura esplicita del nome completo: è solo questione di leggibilità, consente di risparmiare un po 'di digitazione e aiuta a prevenire lo scontro tra classi con lo stesso nome.

3

Importa solo nel seguente caso,

Se si desidera utilizzare una classe che è disponibile in multipli pacchetti. , ad esempio la classe Date è disponibile in java.util & java.sql

È possibile importare uno della classe precedente all'inizio del programma e utilizzare la sintassi qualificata per un altro.