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.