2011-12-18 10 views
6

Cosa si ottiene dalle istruzioni java ridondanti import?qual è l'impatto delle istruzioni di importazione ridondanti in Java?

Effetto del runtime compilato (prestazioni/dimensioni)? o solo cose come intellisense?

Per chiedere in modo diverso: quanto è importante rimuoverli?

+0

Grazie a tutti per i vostri commenti. Questo è stato molto istruttivo. Sono consapevole della necessità di mantenere pulito il mio codice e di quando è e quando non è il momento di preoccuparsi delle prestazioni. Questo era solo per l'istruzione aggiunta. Ora sento anche che la parola "ridondante" era la scelta sbagliata, quello che intendevo era una dichiarazione di importazione che non è più necessaria. come se tu usassi qualcosa come java.util.ArrayList e poi cambi il tuo codice in modo tale che questa classe non sia più usata. E stavo vagando se il fatto che la dichiarazione di importazione fosse ancora lì avrebbe reso il mio codice più grande o più lento. – epeleg

risposta

14

Le istruzioni di importazione influiscono solo su ciò che accade durante la compilazione.

Il compilatore prende questo codice e crea un file .class che rappresenta il codice in un formato eseguibile (qualcosa in binario).

Alla fine, i binari sono esattamente gli stessi, ma il metodo con cui sono realizzati sono diversi. sguardo

Let ad un caso semplice:

import java.util.*; 

vs

import java.util.ArrayList; 
import java.util.List; 

se usato in:

//... 
List <String> someList = new ArrayList <String>(); 
//... 

Quando il compilatore colpisce la parola List, nel primo caso, sarà necessario capire se List esiste in quel set di classi o no. Nel secondo caso, è già dato esplicitamente, quindi è molto più facile.

In sostanza, il compilatore deve prendere tutte le classi esistenti nelle istruzioni import e tenere traccia dei loro nomi in modo che, se lo si utilizza, il compilatore possa recuperare le funzioni appropriate che si stanno chiamando.

A volte esistono classi con lo stesso nome in più pacchetti.È in questo caso (a cui si riferisce Thomas) che non si dovrebbe usare lo * per selezionare tutte le classi nella directory.

È consigliabile descrivere esplicitamente l'utilizzo della classe.

1

Il pericolo maggiore sono le collisioni nello spazio dei nomi. Se due librerie importate hanno entrambe un tipo di lista, ad esempio, non può usare quello che pensi sia.

+5

Questo non è corretto. Diciamo che vuoi importare 'List' e importare sia' java.awt.List' che 'java.util.List', il compilatore si lamenterà della seconda perché hai già un'importazione di tipo singolo per' List'. Se importate 'java.awt. *' E 'java.util. *' Il compilatore fallirà a causa di riferimenti ambigui a 'List'. L'unico modo per raggiungere lo scenario è se importi un solo carattere singolo e uno jolly, ad es. 'java.awt. *' e 'java.util.List' - il tipo singolo verrà preferito. Vedi la specifica del linguaggio Java [sezione 7.5.1] (http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.5.1) – Paul

1

E 'importante per rimuoverli perché aggiungono gonfiare al file .java e per sbarazzarsi di loro all'interno di un determinato file è veloce e poco costoso, soprattutto se si sta utilizzando un IDE (CTRL - SHIFT - O, credo, è la scorciatoia in Eclipse).

Per quanto riguarda "Cosa fanno le importazioni ridondanti per la macchina", beh, non molto. La classe sarà aggiunta al file jar una volta sola e verrà caricata solo una volta per classe (vedere non vis-a-vis "per classe"), quindi a parte aggiungere qualche piccola quantità di tempo a compilazione, non avrà alcun effetto sostanziale a lungo termine sul programma stesso.

Detto questo, è economico e facile da risolvere il problema: se non si utilizza un IDE, istruzioni di importazione allora si dovrebbe avere chiaramente raggruppati che sono in qualche modo sano per cominciare (I alfabetizzare la mia, il che significa che Vedrò immediatamente due importazioni di java.util.Map, perché sarebbero proprio l'una accanto all'altra!). I tuoi colleghi programmatori si complimenteranno attivamente se non lo risolverai, quindi suggerisco che sia nel tuo migliore interesse farlo.

+0

La classe stessa verrà caricata una sola volta, period, a meno che il programma non abbia problemi di caricamento della classe personalizzata. 'Bloat' nel file .java non è nemmeno preciso nel caso di .e.g. 'importa javax.swing. *', e in ogni caso non è una buona ragione per rendere 'importante rimuoverli': non ne hai dato altri. – EJP

+1

@EJP Non è del tutto preciso. A causa del modo in cui la JVM carica le classi, è possibile che più caricatori di avvio carichino la stessa classe più volte. È una sottigliezza che ammetto di non aver spiegato completamente, ma mi è sembrato strano ed eccessivo farlo. – cwallenpoole

+0

È possibile che più * caricatori * caricheranno la classe una volta ciascuno, e ho specificato specificamente casi del genere nel mio commento. – EJP

3

Non influisce sulle prestazioni per avere dichiarazioni di importazione in eccesso. Potrebbe rendere il codice sorgente più lungo di quanto dovrebbe, ma non c'è alcun effetto sul codice compilato. Java stesso importa file di classe non necessari - vedere il Java Language Specificationsection 7.5.5:

Ogni unità di compilazione importa automaticamente tutti di tipo pubblico nomi dichiarati nel pacchetto java.lang predefinito, come se la dichiarazione :
import java.lang.*;
è apparso all'inizio di ciascuna unità di compilazione , seguendo immediatamente qualsiasi istruzione del pacchetto.

Section 7.5.2 dice che

una dichiarazione di tipo-import-on-demand non causa mai qualsiasi altra dichiarazione da ombra.

... significa che le importazioni di caratteri jolly non supereranno le importazioni a partita singola.

Come altri hanno sottolineato, qualsiasi IDE decente (NetBeans, Eclipse, ecc.) Rimuoverà le importazioni inutilizzate.

+0

Non sempre rende il codice sorgente più lungo. 'import javax.swing. *;' probabilmente importa un sacco di classi non utilizzate, ma è molto più breve dell'importazione esplicita di ogni widget Swing che il programma utilizza. –

+0

@Ted, sì, hai ragione, correggerò la mia risposta. – Paul

2

Come molte domande sulle prestazioni, la chiarezza del codice è solitamente più importante. Questo dovrebbe essere il tuo primo pensiero, e solo nei rari casi in cui hai un problema di prestazioni noto (misurato) dovresti considerare di non scrivere il codice più semplice e chiaro che puoi.

Come molte domande sulle prestazioni, in questo caso il codice più semplice e chiaro è anche il più veloce.

Si dovrebbe mantenere il vostro import o avere il vostro IDE li mantengono, per tenerli chiaro e ti fanno codice più facile da mantenere. Il problema di prestazioni è molto piccolo, anche per il compilatore o l'IDE.

Problemi correlati