Java 1.1 Language Specification specifica che il nome di un tipo che è un membro della classe, quando trasforma in codice Java 1.0 lo scopo di generare bytecode di macchine virtuali Java è costituito dal nome completo della classe interna, ad eccezione di ogni .' character following a class name is replaced by a
$ '. Inoltre, ogni costruttore di classi interne riceve l'istanza allegata in un argomento anteposto. Ecco come il codice sorgente trasformato dell'esempio FixedStack potrebbe apparire:
codice
public class FixedStack {
... (the methods omitted here are unchanged)
public java.util.Enumeration elements() {
return new FixedStack$Enumerator(this);
}
}
class FixedStack$Enumerator implements java.util.Enumeration {
private FixedStack this$0; // saved copy of FixedStack.this
FixedStack$Enumerator(FixedStack this$0) {
this.this$0 = this$0;
this.count = this$0.top;
}
int count;
public boolean hasMoreElements() {
return count > 0;
}
public Object nextElement() {
if (count == 0)
throw new NoSuchElementException("FixedStack");
return this$0.array[--count];
}
}
Chi ha già programmato con Java o C++ classi adattatore ha scritto simile a questo, se non che le variabili di collegamento devono essere definite manualmente e in modo esplicito inizializzato nelle classi dell'adattatore di primo livello, mentre il compilatore Java 1.1 le crea automaticamente per le classi interne.
Quando l'enumeratore deve fare riferimento ai campi superiore o di matrice dell'istanza che lo include, viene indiretto tramite un collegamento privato denominato $ 0. L'ortografia di questo nome è una parte obbligatoria della trasformazione delle classi interne nel linguaggio Java 1.0, in modo che i debugger e strumenti simili possano riconoscere facilmente tali collegamenti. (La maggior parte dei programmatori è felicemente inconsapevole di tali nomi.)
(Nota: esiste una limitazione in alcune implementazioni di Java 1.1, in base alle quali l'inizializzazione di $ 0 viene ritardata fino a quando non viene eseguito alcun costruttore di superclasse. i riferimenti di livello fatti da un metodo di sottoclasse possono fallire se il metodo viene eseguito dal costruttore della superclasse.)
fonte
2014-11-26 10:19:30