Esiste un modo per le classi interne anonime in Java a “perdere” il loro campo di applicazione?

StackOverflow https://stackoverflow.com/questions/673021

  •  21-08-2019
  •  | 
  •  

Domanda

Quando passo una classe interna anonima in una funzione, posso fare riferimento a variabili nell'ambito corrente all'interno di un metodo di quella classe, in questo modo:

class Caller {
    private Object callerPrivate;

    // ...

    public void someMethod() {
        final String callerLocal = "Eyes only";

        ISomeInterface anon = new ISomeInterface() {
                                     public void doSomethingInterfacy {
                                         System.out.println(callerPrivate.toString());
                                         System.out.println(callerLocal);
                                     }
                                  };
        // this is some other object that puts ISomeInterfaces in a queue
        // and makes them doSomethingInterfacy later
        myCallManager.enqueue(anon);
    }
}

Ora, dopo someMethod sopra è stato eseguito, il chiamante e la coda con i piccoli anons può andare strade separate, e, per quanto mi risulta, la JVM mantiene tutti i riferimenti retta in modo che questo funziona sempre.

Ma cosa succede se, per esempio, la coda viene serializzato, il programma di chiusura e il riavvio, e dopo che la coda viene deserializzato e gli elementi in esso deve essere eseguito, con l'istanza del chiamante ormai lontani e dimenticati?

E ci sono altri modi per l'oggetto che circonda e la classe interna anonima per essere separati in modo che le chiamate all'interno della classe anon non funziona più?

È stato utile?

Soluzione

Non puntate classi locali, in quanto (a) i documenti dicono così e (b) la rappresentazione seriale non è stabile (non hanno un nome stabile per un inizio).

Se non si desidera che l'istanza per mantenere campi per esterno questo e la gente del posto finali utilizzati, utilizzare un (statico) classe annidata o un classe esterna. Per (Java) serializzazione, è possibile utilizzare writeReplace a puntate un oggetto proxy di serie.

Altri suggerimenti

Non dimenticate che il vostro classe interna anonima contiene un implicito questo di riferimento. cioè un riferimento alla classe circostante.

Quindi, se puntate la vostra classe interna, ci sarà un riferimento alla classe esterna. Si può vedere chiaramente se puntate utilizzando xstream e visualizzare l'output XML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top