Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
No desenvolvimento em Java, muitas vezes nos deparamos com a limitação de que a interface Runnable não aceita parâmetros diretamente. Isso acaba dificultando a implementação de tarefas que precisam de dados dinâmicos, especialmente em aplicações que requerem maior flexibilidade ou operações específicas.
Uma abordagem comum é criar classes anônimas ou lambdas que capturam variáveis do escopo externo, mas isso nem sempre é suficiente, especialmente se a lógica precisa ser mais encapsulada ou reutilizável.
Uma solução prática é criar uma interface funcional customizada, como FuncRunnable, que aceita parâmetros na sua execução. Assim, podemos manter a ideia de tarefas que podem receber dados no momento da execução, sem quebrar princípios OO. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Exemplo:
@FunctionalInterface
public interface ParamRunnable {
void run(Object... params). }
// Implementação
ParamRunnable minhaTarefa = (params) -> {
String dado = (String) params[0]. // lógica com dado
}. // Execução
minhaTarefa.run("valorDinâmico").
Essa estratégia evita criar muitas subclasses ou lambdas complexas, além de manter o código mais limpo e de fácil manutenção. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Na sua opinião, qual seria o impacto de usar esse tipo de abordagem em projetos maiores? Vale a pena para casos simples ou acaba complicando a estrutura? A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Concordo, Gabriel. Aqui no time, a gente preferiu usar classes específicas pra cada tarefa, assim fica mais controlável.
Essa ideia de criar uma interface customizada é útil, especialmente pra evitar gambiarras com variáveis externas. Mas em projetos mais complexos, acho que ainda fica difícil manter muitas dessas lambdas, né?
No meu caso, acho que depende muito do volume de tarefas.