Code review Java: processo, checklist e pontos críticos
Code review em Java funciona melhor quando o time tem um processo claro. Sem isso, a revisão vira uma mistura de opinião, comentário de estilo, discussão de arquitetura e bug passando no meio do diff.
Um bom review precisa responder algumas perguntas simples: a mudança faz o que deveria fazer? O código é fácil de manter? Existe risco de segurança, performance ou concorrência? Os testes cobrem o comportamento mais importante? O PR está pequeno o suficiente para ser revisado com atenção?
Este guia mostra um processo prático de code review Java, com checklist técnico e pontos que merecem atenção em projetos com Spring, JPA, APIs, jobs e serviços backend.
Processo de code review Java: visão rápida
| Etapa | O que fazer | O que verificar em Java |
|---|---|---|
| Antes de abrir o PR | Rodar testes, build, lint e self-review | JUnit, Maven/Gradle, Checkstyle, SpotBugs, PMD |
| Descrição do PR | Explicar problema, solução, risco e como testar | Endpoints, migrations, jobs, eventos e fluxos afetados |
| Review automatizado | Deixar ferramentas pegarem problemas repetitivos | Estilo, bugs prováveis, dependências, segurança e cobertura |
| Review humano | Avaliar design, regra de negócio e manutenção | Spring, JPA, concorrência, exceptions, performance e testes |
| Ajustes e merge | Responder feedback, corrigir riscos e validar CI | Sem regressões, sem warnings críticos, sem dívida escondida |
Por que code review em Java exige uma atenção especial
Java aparece muito em sistemas grandes, com várias camadas, integrações, regras de negócio e vida longa. Um trecho pequeno no diff pode afetar transações, consultas JPA, filas, caches, permissões ou jobs assíncronos.
Também existe uma falsa sensação de segurança. O compilador ajuda, os tipos ajudam, a IDE ajuda. Mesmo assim, muita coisa importante só aparece quando alguém olha para o comportamento da mudança. Uma query pode passar nos testes e gerar N+1 em produção. Um método pode compilar e ainda engolir uma exceção crítica. Uma classe pode parecer simples e abrir caminho para acoplamento ruim.
Por isso, code review em Java precisa combinar ferramentas e análise de quem conhece o sistema. Ferramentas pegam o repetitivo. Pessoas avaliam contexto, design e impacto real da mudança.
Antes de abrir o pull request
Antes de pedir review, o autor deveria revisar o próprio PR com atenção. Isso evita que quem revisa perca tempo com problemas que poderiam ter sido corrigidos antes.
- O build passa localmente com Maven ou Gradle.
- Os testes relevantes foram executados.
- Não há logs temporários, código morto ou comentários de debug.
- Novas dependências foram justificadas.
- O PR está focado em uma mudança principal.
- A descrição explica o motivo da mudança e como testar.
Se o PR altera um comportamento crítico, como checkout, autorização, pagamento, cálculo financeiro ou processamento assíncrono, deixe isso claro na descrição. Assim, quem revisa sabe onde concentrar a atenção.
Como escrever um PR de Java fácil de revisar
Um PR fácil de revisar deixa a intenção da mudança clara. Quem revisa não deveria precisar reconstruir a história inteira em outra ferramenta para entender o que está acontecendo.
## O que mudou?
Explique a mudança principal em poucas frases.
## Por que essa mudança existe?
Link do ticket, bug, regra de negócio ou decisão técnica.
## Como foi testado?
Liste testes unitários, integração, testes manuais e cenários críticos.
## Riscos
Mencione migrations, transações, filas, caches, permissões ou integrações afetadas.
## Foco do review
Diga onde o revisor deve prestar mais atenção.
Se houve mudança visual, inclua screenshot. Se houve migration, explique se ela é reversível. Se houve alteração em API pública, documente o impacto para consumidores.
Checks automáticos para Java
O básico não deveria depender de comentário manual. Formatação, imports, regras simples de estilo, bugs prováveis e dependências vulneráveis devem aparecer antes da revisão humana.
| Ferramenta | O que ajuda a revisar |
|---|---|
| Checkstyle | Convenções de estilo, imports, formatação e padrões do projeto |
| SpotBugs | Bugs prováveis, uso incorreto de APIs e padrões perigosos |
| PMD | Complexidade, duplicação e más práticas comuns |
| Error Prone | Erros detectáveis em tempo de compilação |
| OWASP Dependency-Check | Dependências com vulnerabilidades conhecidas |
A Kodus entra em outra camada. Em vez de substituir um linter, ela revisa o pull request com contexto do repositório, regras específicas do time e análise entre arquivos. Em projetos que usam Java, isso ajuda a encontrar problemas que ferramentas tradicionais nem sempre entendem bem, como uso incorreto de transações, riscos em fluxos Spring, mudanças difíceis de manter, falta de teste para regra de negócio e aderência ao que foi pedido na issue ou spec.
Como revisar legibilidade em código Java
Java tende a ser explícito. Isso ajuda, mas também permite criar classes enormes com nomes genéricos e responsabilidades demais.
No review, olhe para nomes como se você fosse manter aquele trecho daqui a seis meses. process(), handle(), data e manager raramente dizem o suficiente. Nomes como recalculateInvoiceTotals(), CustomerEligibilityService ou PaymentAttemptRepository deixam a intenção mais clara.
Olhe também para a responsabilidade da classe. Se ela valida entrada, calcula regra de negócio, persiste dados e ainda publica evento, talvez esteja acumulando decisões demais em um lugar só.
Lógica, edge cases e comportamento real
Depois de entender a mudança, valide o comportamento: o código faz o que o produto precisa?
Procure cenários que ficam fora do fluxo esperado:
- entrada nula;
- coleção vazia;
- datas com fuso horário;
- valores financeiros com arredondamento;
- usuário sem permissão;
- integração externa fora do ar;
- mensagem duplicada em fila;
- evento chegando fora de ordem.
Quando o PR corrige um bug, peça um teste de regressão. Sem isso, o problema pode voltar em uma mudança futura.
Gerenciamento de recursos
Arquivos, streams, sockets, readers e conexões precisam ter um ciclo de vida claro. Se o objeto implementa AutoCloseable, o review deve procurar o uso de try-with-resources.
try (BufferedReader reader = Files.newBufferedReader(path)) {
return reader.readLine();
}
A documentação da Oracle sobre try-with-resources mostra justamente esse ponto: o recurso é fechado ao final do bloco, inclusive quando ocorre uma exceção.
Esse detalhe parece pequeno no diff. Em um serviço com bastante carga, vazamento de conexão, stream ou socket pode virar incidente.
Exceptions e logs
Em Java, problemas de tratamento de erro costumam aparecer quando o código captura exceções de forma ampla demais ou deixa falhas importantes sem tratamento.
Durante o review, verifique:
catchvazio;catch (Exception e)sem motivo claro;catch (Throwable t)em código comum de aplicação;- log sem contexto para investigar depois;
- log com dados sensíveis;
- erro externo tratado como sucesso silencioso.
O código precisa deixar claro o que acontece quando algo falha. Às vezes a resposta certa é fazer retry. Às vezes é retornar erro. Em outros casos, é interromper o fluxo para preservar a consistência. O review deve avaliar se essa escolha faz sentido.
Spring: o que revisar com mais cuidado
Em projetos Spring, uma mudança pequena no diff pode alterar bastante o comportamento da aplicação em runtime.
Confira principalmente:
- se
@Transactionalestá na camada certa; - se uma transação não envolve chamada HTTP ou operação lenta demais;
- se controllers não estão carregando regra de negócio;
- se services não viraram classes com responsabilidade demais;
- se validações de entrada estão na borda do sistema;
- se mudanças em beans ou configs afetam outros fluxos.
Um caso comum é usar @Transactional para contornar erro de lazy loading. Pode funcionar no curto prazo, mas também pode esconder um problema de modelagem, consulta ou fronteira entre camadas.
JPA e Hibernate
JPA exige atenção especial no review. O código pode parecer simples no Java, mas gerar consultas caras, N+1 ou mudanças perigosas no banco.
Olhe para:
- queries N+1;
- lazy loading fora do contexto esperado;
- consultas sem paginação;
- relacionamentos novos entre entidades;
- migrations que travam tabela grande;
- operações em lote feitas item por item;
- mudança de cascade sem discussão explícita.
Se o PR altera entidade, repository ou migration, peça um teste ou validação com dados realistas. Não precisa ser perfeito, mas “rodei no meu banco local vazio” costuma ser pouco para esse tipo de mudança.
Performance e estruturas de dados
Performance em Java nem sempre começa com profiler. Muitas vezes, o problema está em uma estrutura de dados que não combina com o volume esperado.
Um ArrayList percorrido várias vezes pode funcionar bem com 20 itens e virar um problema com 200 mil. Um HashMap ou Set pode ser mais adequado quando a operação principal é lookup.
Procure também por loops aninhados em coleções grandes, criação desnecessária de objetos em fluxos muito executados, chamadas ao banco dentro de loops e uso de streams que deixam uma regra simples mais difícil de ler.
Concorrência e código assíncrono
Quando o código envolve threads, executors, filas ou tarefas assíncronas, revise com mais cuidado. Bugs de concorrência raramente aparecem nos testes mais simples e podem surgir apenas em produção.
Verifique se existe estado mutável compartilhado, se a estrutura usada é segura para concorrência e se exceções em tasks assíncronas são observadas. A documentação de java.util.concurrent é uma boa referência para queues, locks, executors e classes atômicas.
Pergunte também se o código realmente precisa de concorrência. Às vezes o PR adiciona async para compensar uma operação lenta que deveria ser revista.
Segurança em code review Java
O review de segurança começa nas fronteiras do sistema: controllers, consumidores de fila, jobs, integrações externas e qualquer lugar que receba dados de fora.
Se o código monta SQL concatenando strings com entrada externa, isso precisa ser ajustado antes do merge. Em JDBC, use PreparedStatement ou uma camada que trate parâmetros corretamente.
PreparedStatement statement = connection.prepareStatement(
"SELECT * FROM users WHERE email = ?"
);
statement.setString(1, email);
O guia da OWASP sobre SQL injection recomenda queries parametrizadas como defesa primária.
Além disso, revise:
- se entradas externas são validadas no backend;
- se endpoints novos têm autorização correta;
- se logs não expõem token, documento, email ou dado sensível;
- se novas dependências foram checadas;
- se secrets não aparecem no código ou em arquivos versionados.
Testes em PRs Java
Um teste fraco pode dar uma falsa sensação de segurança. Em code review, olhe para o que o teste realmente valida.
Para mudanças em Java, normalmente vale procurar:
- teste unitário para regra de negócio;
- teste de integração quando há banco, fila ou API externa;
- teste de regressão para bug fix;
- teste para erro, valor nulo e lista vazia;
- teste para permissão quando a mudança toca acesso;
- teste com dados suficientes para revelar problema de query.
JUnit e Mockito cobrem boa parte dos casos unitários. Para banco e integrações, Testcontainers pode ajudar quando o comportamento depende de infraestrutura real.
Checklist técnico de code review Java
1. Legibilidade e design
- A intenção do código é clara sem explicação externa?
- Nomes de classes, métodos e variáveis são específicos?
- Métodos e classes têm responsabilidade clara?
- O código segue os padrões da codebase ao redor?
- Comentários explicam decisões que não são óbvias?
2. Comportamento e performance
- O código faz o que o ticket descreve?
- Casos nulos, listas vazias e valores limite foram tratados?
- Existe query repetida, loop caro ou estrutura de dados inadequada?
- Recursos são fechados corretamente?
- O PR pode afetar fluxo crítico em produção?
3. Spring e persistência
@Transactionalestá no lugar certo?- Existe risco de N+1 em JPA ou Hibernate?
- Consultas grandes têm paginação?
- Migrations foram pensadas para dados existentes?
- Controllers, services e repositories mantêm fronteiras claras?
4. Erros e resiliência
- Não há
catchvazio? - O código evita capturar
Exceptionsem necessidade? - Falhas externas têm timeout, retry ou fallback quando faz sentido?
- Logs ajudam investigação sem expor dados sensíveis?
5. Segurança
- Entradas externas são validadas no backend?
- Queries usam parâmetros em vez de concatenação de strings?
- Não há secrets hardcoded?
- Permissões foram revisadas nos endpoints afetados?
- Dependências novas foram verificadas?
6. Testes
- A nova lógica tem teste relevante?
- Bug fix tem teste de regressão?
- Os testes validam comportamento, não só ausência de exceção?
- Casos de erro e borda foram cobertos?
- O código é testável sem mocks demais?
Como a Kodus ajuda com code reviews em Java
A Kodus entra no pull request como uma camada de revisão com IA, mas sem ficar presa a comentários genéricos no diff. Ela pode rodar automaticamente quando um PR é aberto ou atualizado, e também pode ser chamada manualmente quando o time quiser revisar de novo depois dos ajustes.
Em projetos Java, isso ajuda principalmente nos pontos que linters tradicionais não costumam pegar: riscos entre arquivos, mudanças em services e repositories, uso incorreto de transações, falta de testes para regra de negócio, validação fraca de entrada, tratamento ruim de exceções e alterações que fogem da arquitetura combinada pelo time.
O time também pode criar Kody Rules para transformar padrões internos em regras de review. Por exemplo: todo endpoint novo precisa ter teste, mudanças em diretórios sensíveis exigem atenção maior, services não devem acessar determinada camada diretamente, ou PRs grandes demais precisam ser sinalizados antes do review de uma pessoa.
Essas regras podem ser aplicadas por arquivo ou no pull request inteiro. Elas consideram contexto do PR, como título, descrição, arquivos alterados e diff completo, além de referências a arquivos do próprio repositório. Para times Java, isso permite criar padrões específicos para Spring, JPA, transações, segurança, testes e organização de camadas.
Outra opção é usar a biblioteca de regras da Kodus. Em vez de começar do zero, o time pode buscar regras prontas por severidade, linguagem ou tags, importar o que fizer sentido e ativar em poucos cliques. Depois, cada regra pode ser ajustada para refletir as convenções reais da codebase.
Para conferir se o PR implementa o que foi pedido, a Kodus também tem Business Logic Validation. Ela compara o diff com uma issue, spec, documento ou critério de aceite, e aponta quando algo obrigatório ficou fora da implementação. Isso é útil em mudanças que mexem com regra de negócio, porque o risco nem sempre está na sintaxe ou no estilo, mas em um comportamento incompleto.
A Kodus é open source, está disponível no GitHub e suporta BYOK. O time pode usar a própria chave de modelo, escolher o provedor e manter controle sobre custo, configuração e política interna de IA.
Faq sobre code review em Java
Como fazer code review em Java?
Comece pelo objetivo do PR, rode checks automáticos e depois revise comportamento, legibilidade, segurança, performance, exceptions e testes. Em projetos Java, olhe também para Spring, JPA, transações, concorrência e gerenciamento de recursos.
O que verificar em um code review Java?
Verifique nomes, estrutura das classes, regras de negócio, uso de collections, queries, tratamento de exceções, validação de entrada, dependências, testes e impacto em produção. O review deve encontrar riscos que compilador, linter e testes podem não pegar sozinhos.
Qual é o processo ideal para revisar PRs Java?
Um bom processo começa com self-review do autor, passa por build, testes e checks automáticos, segue para revisão humana focada em comportamento e design, depois volta para ajustes e validação final antes do merge.
Quais ferramentas ajudam no code review Java?
Checkstyle, SpotBugs, PMD, Error Prone, OWASP Dependency-Check, JUnit, Mockito, Testcontainers e ferramentas de revisão com IA como a Kodus podem ajudar.
Como revisar código Java com Spring?
Em projetos Spring, revise separação entre controllers, services e repositories, uso de @Transactional, validação de entrada, tratamento de erros, segurança em endpoints e impacto de mudanças em beans, eventos e configurações.
Como evitar problemas de segurança em Java?
Valide entradas externas no backend, evite SQL concatenado, use queries parametrizadas, não exponha secrets, revise permissões e cheque dependências vulneráveis. Também vale olhar logs para garantir que dados sensíveis não estejam sendo registrados.
Conclusão
Code review Java melhora quando o time sabe o que cada parte do processo deve pegar. Ferramentas cuidam do repetitivo. Pessoas olham comportamento, arquitetura, segurança e manutenção.
Quando esse fluxo está claro, o review deixa de depender tanto de memória individual. O PR chega com mais contexto, os riscos aparecem mais cedo e o time gasta menos energia discutindo detalhe que poderia ter sido automatizado.