Wenn ich eine anonyme innere Klasse an eine Funktion übergebe, kann ich aus einer Methode dieser Klasse heraus auf Variablen im aktuellen Gültigkeitsbereich verweisen, etwa so:
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);
}
}
Nun, nachdem someMethod oben ausgeführt wurde, können der Aufrufer und die Warteschlange mit den kleinen Anons getrennte Wege gehen, und soweit ich es verstanden habe, hält die JVM alle Verweise gerade, so dass dies immer funktioniert.
Was aber, wenn zum Beispiel die Warteschlange serialisiert wird, das Programm heruntergefahren und neu gestartet wird, und danach die Warteschlange deserialisiert wird und die Elemente in ihr ausgeführt werden sollen, wobei die Aufrufer-Instanz längst verschwunden und vergessen ist?
Und gibt es andere Möglichkeiten für das umgebende Objekt und die anonyme innere Klasse in einer Weise, die Aufrufe innerhalb der anon-Klasse nicht mehr funktionieren getrennt werden?