Acho que um dos recursos mais desconhecidos da linguagem é a existência das local classes. Local classes são classes definidas dentro de métodos ou blocos em geral, algo como:
public void umMetodo() throws InterruptedException {
class LocalRunnable implements Runnable {
private UmBean umBean;
public void run() {
umBean = variavelPrivada.fazAlgoLento();
}
public UmBean getUmBean() {
return umBean;
}
}
LocalRunnable lr = new LocalRunnable();
Thread t = new Thread(lr);
t.start();
try {
t.join();
} catch (InterruptedException ie) {
throw ie;
}
return lr.getUmBean();
}
No exemplo acima, criamos uma implementação de Runnable que permite obter, após a execução do método run(), o valor computado de uma operação lenta (ok, fora permitir que a thread atual possa ser interrompida enquanto o método executa, não há lá grandes vantagens em criar uma thread para esperar imediatamente pelo seu resultado).
Muitas vezes cria-se uma inner class “nomeada” apenas para ter acesso a alguns métodos adicionais, visto que não é possível chamar normalmente um método de uma anonymous inner class. As local classes resolvem justamente esse problema, como o exemplo acima demonstra.
E você, conhecia esse recurso? Mais informações na JLS.