Intermediate Class - Ballet Intermediate Class - IFBC
Ballet Intermediate Class - IFBC

O que realmente é uma classe intermediária em Java

A classe intermediária é basicamente uma classe abstrata que implementa uma interface e oferece parte da lógica reutilizável antes que as subclasses concretas cheguem. Ela existe para evitar duplicação de código entre múltiplas implementações que compartilham comportamento comum. Ninguém precisa de mais uma definição de livro didático. O que importa é como ela funciona no dia a dia. Eu construí sistemas inteiros sem usar classes intermediárias e depois passei semanas refatorando porque cada implementação concreta replicava os mesmos trinta linhas de validação. Depois que adotei o padrão, o tempo de desenvolvimento caiu drasticamente. Não é mágica. É só organização.

Como criar uma intermediate class funcional

Vamos ao código. Imagine que você tem uma interface ProcessadorDeDados com dois métodos: validar() e processar(). Várias classes concretas vão implementar essa interface, mas todas precisam validar os dados antes de processá-los. A validação é idêntica em todas. Aqui entra a classe intermediária. Você cria uma classe abstrata chamada ProcessadorDeDadosBase que implementa ProcessadorDeDados. Dentro dela, o método validar() recebe uma implementação concreta. O método processar() é deixado como abstrato para as subclasses preencherem. A classe intermediária fica assim:

public abstract class ProcessadorDeDadosBase implements ProcessadorDeDados {
    @Override
    public boolean validar(ObjetoDados dados) {
        if (dados == null) return false;
        if (dados.getCampoA() == null) return false;
        return dados.getCampoB() != null;
    }
    protected abstract void processarConteudo(ObjetoDados dados);
}
As subclasses concretas herdam ProcessadorDeDadosBase e só precisam implementar o método abstrato. O código de validação já está lá, funcionando, testado e centralizado.

👉 Clique no botão abaixo para saber mais sobre o assunto!

A desvantagem que ninguém menciona é o acoplamento. Quando você herda de uma classe intermediária, perde flexibilidade. Java não permite herança múltipla, então se sua classe concreta já estende outra classe, você não consegue usar esse padrão. Eu perdi duas horas num domingo debugando porque tentei fazer uma classe estender ProcessadorDeDadosBase e também EntidadePersistivel ao mesmo tempo. Não funciona. Ponto.

Quando NÃO usar uma intermediate class

Tem cenário em que a classe intermediária piora o código. Se o comportamento comum é mínimo — tipo dois ou três métodos com linha única —, uma classe intermediária só introduz complexidade desnecessária. Nesse caso, interfaces normais com default methods resolvem o mesmo problema sem criar uma hierarquia extra. Outro caso: quando as implementações variam muito na forma como usam a lógica compartilhada. Eu tive um projeto onde três subclasses precisavam de validações completamente diferentes. A classe intermediária acabou tendo que expor métodos protegidos pra tudo, e o resultado foi um monstro de vinte métodos protegidos que ninguém sabia pra quê serviam. Refatorei para composição. Cada subclass passou a receber um objeto de validação via construtor. Ficou mais limpo e as validações puderam ser trocadas em runtime.

Classe intermediária é ferramenta, não solução universal. Use quando a duplicação de código for real e mensurável. Teste antes de aplicar. Se o ganho for menor que o custo de manutenção da hierarquia, desista do padrão.

Dica prática: teste a camada intermediária separadamente

Muita gente esquece de testar a classe intermediária isoladamente. Como ela é abstrata, você precisa de uma subclass stub temporária só pra rodar os testes. Crie uma classe anônima ou uma classe de teste dentro do mesmo pacote. Isso leva cinco minutos e evita que bugs na validação central causem falhas em três subclasses diferentes ao mesmo tempo. Custo baixo. Retorno alto.