Ao trabalhar com programas Java baseados na interface do usuário, uma maneira de anexar o comportamento a determinadas ações (por exemplo, com um clique no botão) é através do uso de classes anônimas. No exemplo abaixo, a estrutura da GUI é SWT, no entanto, tenho os mesmos problemas com os componentes da interface do usuário Swing ou Android. Ou seja, a estruturação dos meus programas.
MenuItem sampleMenuItem = new MenuItem(popupMenu, SWT.NONE);
sampleMenuItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
doSomething();
// handle all table entries
for (int i=0; i<10; i++) {
doSomething2();
}
doSomething3();
doSomething4();
}
});
Certamente, alguns podem argumentar que a quantidade de código na amostra acima já justifica a criação de uma classe dedicada que contém a lógica. Isso também é sugerido pela regra "As classes anônimas do Sonar não devem ter muitas linhas" .
Curiosamente, esta regra também especifica que:
squid: S1188 - Enquanto aguarda o suporte ao fechamento em Java, as classes anônimas são a maneira mais conveniente de injetar um comportamento sem precisar criar uma classe dedicada. Mas essas classes internas anônimas devem ser usadas apenas se o comportamento puder ser realizado em poucas linhas. Com código mais complexo, é chamada uma classe nomeada.
No entanto, como os fechamentos ainda não chegaram ao Java, minha pergunta é se existem soluções mais elegantes do que :
- escrever um monte de código dentro de classes anônimas que tem todos os tipos de desvantagens (reutilização limitada, navegação mais lenta no código, ...)
- criando um grande número de classes dedicadas, as quais podem ter funcionalidades muito limitadas (por exemplo: excesso de engenharia, ...)
Para estender minha pergunta: eu também gostaria de saber quais são as melhores práticas com relação a esse aspecto dos aplicativos de UI baseados em Java? Existem padrões bem estabelecidos?