Instead of defining the inner class within another class, it can also be defined locally within a method:
package littletux.net.innerclass;
public class LocalInnerClass {
private PrintManager pm;
public static void main(String[] args) {
LocalInnerClass app = new LocalInnerClass();
app.initApp(); // local inner class is defined locally here ...
app.runApp(); // ... but is still available here!!
}
private void initApp() {
pm = new PrintManager();
/*****************************************************************/
// Local inner class - LocalInnerClass$1LocalPrinter.class
class LocalPrinter implements Printer {
@Override
public void printString(String value) {
System.err.println("LocalPrinter: " + value);
}
}
pm.setPrinter(new LocalPrinter());
/*****************************************************************/
}
private void runApp() {
pm.print("Hello World");
}
}
The interesting thing to note here is that the class is both defined and instantiated inside a method, but still available even after the scope of the defining method has been left. This can be seen as a kind of closure.