2013-01-10 4 views
8

Si consideri il seguente semplice esempio di codice:importazione statica senza nome del pacchetto

public class TestStaticImport { 
    static enum Branches { 
     APPLE, 
     IBM 
    } 
    public static void doSomething(Branches branch) { 
     if (branch == APPLE) { 
      System.out.println("Apple"); 
     } 
    } 
} 

Se cercheremo di compilare questo codice, si riceverà il messaggio di errore:

java: cannot find symbol 
    symbol: variable APPLE 
    location: class TestStaticImport 

Questo potrebbe essere risolto introducendo l'importazione statica di questo enum:

import static ... TestStaticImport.Branches.*

ma per il momento le cose incomprensibili (per me) Iniziamo:

questa soluzione funziona bene, tutto è ben compilato, fino classe TestStaticImport verrà spostato nel package principale vuota, vale a dire non c'è alcuna

package blablabla; nella parte superiore di questo file java;

linea

Codice: import static TestStaticImport.Branches.*; è evidenziato come codice valido nel mio IntelliJ IDEA (nome di IDE non importa, solo per informazioni), ma quando provo a compilare tale codice seguente errore:

java: package TestStaticImport does not exist

Quindi, ci sono in realtà due domande:

1) domanda principale: perché è impossibile import static dalla directory vuota?

2) Qual è un altro modo (se esiste) per consentire riferimenti in codice ai campi di enum utilizzando solo i loro nomi (ad esempio APPLE anziché Branches.APPLE), eccetto l'importazione statica?


P.S. Per favore, non dirmi che i pacchi vuoti sono brutti, e così via. Questa domanda è solo un problema teorico.

+0

ho avevo incontrato lo stesso problema come voi per la prima domanda ... Per quanto posso vedere è una limitazione. – fge

risposta

11

Il Java language specification vieta qualsiasi importazioni dal pacchetto senza nome:

Un tipo in un pacchetto senza nome (§7.4.2) non ha nome canonico, in modo che il requisito per un nome canonico in ogni tipo di importazione la dichiarazione implica che (a) i tipi di un pacchetto senza nome non possono essere importati e che (b) membri statici di tipi in un pacchetto senza nome non possono essere importati. Pertanto, §7.5.1, §7.5.2, § 7.5.3 e § 7.5.4 richiedono tutti un errore in fase di compilazione per qualsiasi tentativo di importazione di un tipo (o membro statico di esso) in un pacchetto senza nome .

+0

E quello relativo è 7.5.3/4. – assylias

+0

Bene, grazie mille per la risposta esatta con il collegamento alle specifiche! – Andremoniy

5

Nei tempi antichi, gli inventori di Java dovevano mappare i tipi Java ai file in modo che il compilatore potesse fare del vero lavoro. Hanno deciso di mappare i pacchetti alle cartelle e tipi ai file. Ha funzionato abbastanza bene. Stabilisce in particolare il background emotivo per i nuovi arrivati: "Ti odio, non scherzare con me". Ma sto divagando.

Il pacchetto predefinito è un problema, tuttavia, poiché non ha una cartella ben definita.Se hai il pacchetto com, sai che c'è una cartella com da qualche parte ma qual è il nome della cartella per il pacchetto predefinito?

Quindi i progettisti hanno deciso che import e il pacchetto predefinito non si mescolano. Infatti, si verifica un errore quando si tenta di importare qualsiasi cosa che non ha alcun pacchetto (ad esempio, import TestStaticImport senza lo static e * non riuscirebbe). Vedi How to import a class from default package

Quindi il problema non è l'importazione statica ma si tenta di importare dal pacchetto predefinito.

Come altri casi angolari in Java, non esiste una soluzione.

vedi anche: In Java- "Static Members of the default package cannot be imported"- Can some one explain this statement?