Qualche motivo per ripulire le importazioni inutilizzate in Java, oltre a ridurre il disordine?


99

C'è qualche buona ragione per evitare istruzioni di importazione inutilizzate in Java? A quanto ho capito, sono lì per il compilatore, quindi molte importazioni inutilizzate non avranno alcun impatto sul codice compilato. È solo per ridurre il disordine ed evitare conflitti di denominazione lungo la linea?

(Lo chiedo perché Eclipse fornisce un avviso sulle importazioni inutilizzate, il che è un po 'fastidioso quando sto sviluppando codice perché non voglio rimuovere le importazioni finché non sono abbastanza sicuro di aver finito di progettare la classe.)

Risposte:


86

Non penso che siano probabili problemi di prestazioni o qualcosa del genere se non rimuovi le importazioni.

Ma potrebbero esserci conflitti di denominazione, in rari casi come l'importazione dell'interfaccia dell'elenco.

In Eclipse puoi sempre usare un collegamento (dipende dal sistema operativo - Win: Ctrl + SHIFT + Oe Mac :) COMMAND + SHIFT + Oper organizzare le importazioni. Eclipse quindi pulisce la sezione di importazione rimuove tutte le importazioni non aggiornate ecc. Se hai bisogno di nuovo di una cosa importata, eclipse le aggiungerà automaticamente mentre stai completando l'istruzione con Ctrl + SPACE. Quindi non è necessario mantenere il codice inutilizzato nella tua classe.

Come sempre il codice inutilizzato distrarrà te e le altre persone durante la lettura del codice e lascerà qualcosa nel tuo codice attivo perché forse ne ho bisogno in seguito è per lo più visto come una cattiva pratica.


22
In realtà è Ctrl + Maiusc + O su Windows.
Matt Ball

1
Ctrl + Maiusc + O su Linux bene. Probabilmente lo stesso su BSD.
WhyNotHugo

2
Un altro modo per arrivare all'azione organizza importazioni è fare clic ctrl+3(almeno su windwos) e quindi digitare importazioni. È ovviamente più lento di ctrl + maiusc + O ma è un modo per trovarlo rapidamente (e molte altre azioni che ricordi o stai solo cercando di trovare) anche se non ricordi la scorciatoia specifica per questo.
epeleg

53

Uno sarebbe che se rimuovi la classe a cui fa riferimento l'importazione dal classpath, non otterrai uno stupido errore del compilatore che non ha avuto alcuno scopo. E non otterrai falsi positivi quando esegui una ricerca "dove usato".

Un altro (ma questo sarebbe di natura molto specifica) sarebbe se l'importazione inutilizzata avesse conflitti di denominazione con un'altra importazione, causando l'uso inutile di nomi completamente qualificati.

Addendum: oggi il server di compilazione ha iniziato la compilazione non riuscita (nemmeno il test in esecuzione) con un errore di memoria insufficiente. Ha funzionato bene per sempre e i check-in non hanno apportato modifiche al processo di compilazione o aggiunte significative che potrebbero spiegare questo. Dopo aver tentato di aumentare le impostazioni di memoria (si tratta di una JVM a 64 bit su un CentOS a 64 bit!) A qualcosa che va ben oltre il punto in cui i client potevano compilare, ho esaminato i controlli uno per uno.

C'era un'importazione impropria che uno sviluppatore aveva utilizzato e abbandonato (hanno usato la classe, l'hanno importata automaticamente e poi si sono resi conto che era un errore). Quell'importazione inutilizzata ha inserito un intero livello separato dell'applicazione che, sebbene l'IDE non sia configurato per separarli, il processo di compilazione lo è. Quella singola importazione ha trascinato in così tante classi che il compilatore ha tentato di compilare senza avere le librerie dipendenti pertinenti nel classpath, che questo ha causato così tanti problemi da causare l'errore di memoria insufficiente. Ci è voluta un'ora per risolvere questo problema causato da un'importazione inutilizzata.


4
@Yishai, se usi Eclipse guarda in Save Actions, che può normalizzare il codice sorgente ogni volta che salvi.
Thorbjørn Ravn Andersen

2
@EJP, sebbene non influenzino il bytecode risultante, il compilatore deve risolverli per comprendere il bytecode che deve creare.
Yishai

3
@EJP, l'intera aggiunta parla del tempo di compilazione ("compilazione del server iniziata con errori di compilazione").
Yishai

1
Continuo a non capire come la sola importazione possa causare tutto questo?
Thorbjørn Ravn Andersen

1
@Yishai Scusa ma non ci credo. Hai diagnosticato male questo. L'importazione non dovrebbe avere tale effetto, a meno che la classe non sia stata effettivamente utilizzata. Tutto ciò che l'istruzione import fa è dire al compilatore in quale pacchetto si trova quella classe. Il compilatore tenta di compilare implicitamente solo quando ha bisogno di informazioni sul tipo su quella classe.
Marchese di Lorne

9

Da un punto di vista purista, qualsiasi dipendenza è un "vincolo" sul prodotto e può quindi causare problemi di manutenzione in un secondo momento.

Ad esempio, supponiamo che il tuo programma utilizzi la classe com.XYZObjectPool e che in seguito decidi di non usarla ma non rimuovere mai l'importazione. Se qualcun altro ora desidera creare un'istanza di org.WVYObjectPool e fare semplicemente riferimento a ObjectPool, non riceve alcun avviso a riguardo fino a quando da qualche parte lungo la linea non c'è un problema di casting o problema di invocazione.

Questo, a proposito, non è uno scenario irrealistico. Ogni volta che Eclipse ti ha chiesto quale versione specifica di X desideri importare e ne hai scelto uno tra tanti pacchetti, è uno scenario in cui se hai avuto l'importazione potresti aver fatto la scelta sbagliata senza saperlo.

In ogni caso, puoi chiedere a Eclipse di ripulirli per te


3

Avvertimento? Chiedi a Eclipse di ripulirli automaticamente per te. Questo è ciò che fa IntelliJ. Se è abbastanza intelligente da avvisarti, dovrebbe essere abbastanza intelligente da ripulirli. Consiglierei di cercare un'impostazione Eclipse per dirgli di smettere di essere un tale ronzino e di fare qualcosa.


4
Questo è salvare le azioni. Personalmente mi piace che Eclipse cambi il tuo codice solo quando lo hai esplicitamente richiesto.
Thorbjørn Ravn Andersen

1
@ Thorbjørn: d'accordo, soprattutto se si tratta di un corso che ho smesso di usare per un po 'ma che mi aspetto di aggiungere di nuovo a breve.
Donal Fellows

2
@Donal, beh, a questo serve Ctrl-Space.
Thorbjørn Ravn Andersen

3

Questo ha a che fare con la chiarezza del programma utile per la manutenzione.

Se dovessi mantenere un programma scoprirai quanto sia utile avere una sola importazione di classi per riga.

Pensa al seguente scenario:

import company.billing.*;
import company.humanrerources.*;

// other imports 


class SomeClass {
      // hundreds or thousands of lines here... 
    public void veryImportantMethod() {
      Customer customer;
      Employee comployee;
      Department dept. 
      // do something with them
     }
 }

Quando si corregge un bug o si mantiene una parte di codice (o solo la si legge) è molto utile per il lettore sapere a quale pacchetto appartengono le classi utilizzate. L'utilizzo dell'importazione di caratteri jolly come mostrato sopra non aiuta a tale scopo.

Anche con un IDE, non vuoi passare il mouse o saltare alla dichiarazione e tornare, è più facile se capisci in termini di funzionalità da quali altri pacchetti e classi dipende il codice corrente.

Se questo è per un progetto personale o qualcosa di piccolo, non importa, ma per qualcosa di più grande che deve essere utilizzato da altri sviluppatori (e mantenuto negli anni) questo è un MUST HAVE.

Non c'è assolutamente alcuna differenza di prestazioni con nessuno.


3

Cordiali saluti, questo mi ha colto di sorpresa, poiché non pensavo che l'organizzazione delle importazioni rimuovesse effettivamente le importazioni inutilizzate, pensavo che le avesse semplicemente ordinate.

La rimozione automatica delle importazioni durante un'operazione di salvataggio mi ha causato qualche problema quando, ad esempio, durante lo sviluppo o il test si ha un problema e si commenta del codice, quando lo si salva, le importazioni utilizzate dalla sezione di codice commentata vengono rimosse. A volte questo non è un problema in quanto puoi annullare ( Ctrl+ Z) le modifiche, ma altre volte non è così semplice in quanto potresti aver apportato altre modifiche. Ho anche avuto un problema in cui quando ho decommentato il codice (ho precedentemente commentato e salvato, rimuovendo così le importazioni per quel codice), ha cercato automaticamente di indovinare le importazioni che erano necessarie e ha raccolto quelle sbagliate (ad es. aveva unStringUtils classe in uso e ne ha scelta un'altra con lo stesso nome dalla libreria sbagliata).

Preferisco organizzare manualmente le importazioni piuttosto che averlo come azione di salvataggio.


2

Per eclipse uso questo: finestra -> preferenze -> java -> editor -> salva azione -> seleziona la casella di controllo per organizzare le importazioni (ci sono anche molte altre cose utili, come la formattazione, rendere i campi finali e così via. .). Quindi, quando salvo il mio file, eclipse rimuove le importazioni di unessacry per me. Secondo me, se non hai bisogno di qualcosa, rimuovilo (o lascia che venga rimosso da eclipse).


2

Puoi commentare le istruzioni di importazione inutilizzate e gli avvisi non ti daranno fastidio, ma puoi vedere cosa avevi.


2
@DimaSan In realtà lo fa: la domanda dice che non voglio rimuovere le importazioni finché non sono abbastanza sicuro di aver finito di progettare la classe.
The Vee

1

Non c'è alcun impatto sulle prestazioni, anche se per leggibilità puoi renderlo pulito. La rimozione delle importazioni inutilizzate è abbastanza semplice sia in Eclipse che in IntelliJ IDEA.

Eclisse

Windows / Linux -    Ctrl+Shift +O

Mac -                        Cmd+ Shift+O

IntelliJ IDEA o Android Studio

Windows / Linux -    Ctrl+Alt +O

Mac -                        Cmd+ Alt+O


0

Ho letto da qualche parte, alcuni anni fa, che ogni classe importata sarebbe stata caricata in fase di esecuzione con la classe importatrice. Quindi la rimozione di pacchetti inutilizzati, specialmente interi, ridurrebbe il sovraccarico di memoria. Anche se suppongo che le versioni moderne di java si occupino di questo, quindi probabilmente non è più un motivo.

E a proposito, con eclipse puoi usare Ctrl+ Shift+ Oper organizzare le importazioni, ma puoi anche configurare un "pulitore" che si occupi di queste cose (e molte altre) ogni volta che salvi un file java.


hmm .. sarei sorpreso se questo fosse il comportamento .. so che le classi non vengono inizializzate (cioè chiamando gli inizializzatori statici) fino al primo utilizzo, o fino a quando non vengono specificatamente richieste da un caricatore personalizzato. ma se con "caricato" intendi solo "letto in memoria ma non elaborato" è possibile, anche se ne dubito.
Kip

in realtà, a pensarci bene, dovrebbe essere abbastanza facile da testare. compilare il codice con le importazioni inutilizzate, quindi utilizzare uno strumento di "decompilazione" e vedere se le importazioni inutilizzate sono ancora presenti o meno. in caso contrario, vengono rimossi dal compilatore o sono lì solo per comodità del programmatore.
Kip

4
Dove diavolo l'hai letto? È completamente e completamente sbagliato, e lo è sempre stato. Ogni classe a cui fa riferimento il codice verrà caricata, escluse le importazioni.
Marchese di Lorne

0

Per me, un'importazione di classi inutilizzata in una classe controller ha creato un problema di compilazione nella build di Jenkins dopo che ho eliminato la classe importata durante la pulizia del codice e ho eseguito l'eliminazione in git senza testare una build in locale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.