2012-07-09 13 views
52

ho usato Eclipse come mio IDE di sviluppo. Lo uso anche per esportare la mia applicazione in un file .jar. Quando guardo le mie classi nel file .jar, alcune delle mie classi contengono il nome di quella classe, un segno di dollaro, quindi un numero. Esempio:java classi compilate contengono i segni del dollaro

  • Trova $ 1.class
  • Trova $ 2.class
  • Trova $ 3.class
  • Find.class

ho notato lo fa sulle classi più grandi. Questo perché le classi diventano così grandi, la compila in più classi? Ho cercato su Google e ho cercato su più forum, e ho cercato nella documentazione Java, ma non ho trovato nulla nemmeno relativo ad esso. Qualcuno potrebbe spiegare?

risposta

69

classi interne, se eventualmente presente nella tua classe, saranno compilati e il file di classe saranno ClassName$InnerClassName. Nel caso di classi interne anonime, apparirà come numeri. La dimensione della classe (codice Java) non porta alla generazione di più classi.

E.g. dato questo pezzo di codice:

public class TestInnerOuterClass { 
    class TestInnerChild{ 

    } 

    Serializable annoymousTest = new Serializable() { 
    }; 
} 

classi che verranno generati saranno:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

Aggiornamento:

L'uso della classe anonima non è considerato una cattiva pratica, dipende solo dall'utilizzo.

Controllare this discussione su SO

+0

Ok, quindi è brutto avere una classe anonima? Non capisco come funziona. Se creo una nuova variabile di istanza di una classe in una classe, questa è una classe anonima? – Frizinator

+0

No, non è male avere una classe anonima, dipende dall'utilizzo. Aggiornato il mio post – mprabhat

+4

Enum contenente un corpo di classe genererà automaticamente una classe interna anonima che estende la classe enum e quindi genera un altro file di classe con $ in esso. – dlaidlaw

10

Questo è perché avete le classi anonime all'interno di questa classe più ampia. Vengono compilati utilizzando questa convenzione di denominazione.

Vedi The Anonymous Class Conundrum

0

Per rispondere i suoi commenti su sono classi anonime cattivi. Sono decisamente no. Considerare questo per assegnare un listener di azione per un JButton:

JButton button = new JButton(...); 
button.addActionListener(new ActionListener() { ... }); 

o questo per fare un caso sorta insensitive dal "nome" proprietà

Collections.sort(array, new Comparator<Foo>() { 
    public int compare(Foo f1, Foo f2) { 
     return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); 
    } 
}); 

Vedrete anche un sacco di Runnable e Callable fatto come classi anonime.

5

Oltre ai casi di cui sopra presentati dai @mprabhat, gli altri casi potrebbe essere:

  1. se classe contiene un enum variabile una classe separata sarebbe generato anche per questo. Il nome della classe .lass generata sarà ClassName $ Name_of_enum.
  2. Se la classe X eredita cioè estendere un'altra classe Y, allora ci sarebbe una .class generato con il nome ClassName $ 1.class o ClassName $ 1 $ 1.class
  3. Se la classe X sta attuando un'interfaccia Y, allora ci sarebbe una .class generato con il nome ClassName $ 1.class o NomeClasse $ 1 $ 1.class.

Questi casi sono derivazioni del mio controllo su file .class in jar.

+0

Ho una classe che non soddisfa nessuno di questi criteri e class.getName() è ancora errata-- per Group.java, restituisce Group _ $$ _ jvst248_20. Non ho idea di cosa stia succedendo. Sicuramente nessuna enumerazione, estensione o implementazione. – Amalgovinus

Problemi correlati