Você tá escrevendo Java errado
Toda semana é a mesma resenha, aparece um dev, direto de um código que parece ter saído de um museu, pra soltar a clássica: "Java é muito verboso". Aí chove post, comentário em pull request, e vira até desculpa pra justificar aquele método com mais linhas que a Bíblia.
Mas a real, é que quando a gente para pra olhar o código, a culpa não é bem do Java. É do nosso jeito de escrever.
Um disclaimer antes de começar: Sei que a realidade de muito dev por aí é trampar com código legado, onde nem sempre dá pra usar as features mais recentes. Às vezes, a gente é até obrigado a manter uns padrões mais antigos por causa do projeto. Meu objetivo aqui não é criticar quem tá nesse corre, muito pelo contrário! A resenha aqui é pra quem já tem a chance de usar as versões novas do Java, mas continua com a mentalidade e os hábitos lá de trás. Fechou? Então bora!
O verdadeiro problema? A preguiça de atualizar
Esse é o tipo de código que a galera faz e depois sai culpando a linguagem:
Pedido pedido = new Pedido();
pedido.setClienteId("cliente-957");
pedido.setValorTotal(189.50);
pedido.setItens(List.of("Moqueca de Camarão", "Acarajé", "Cerveja Gelada"));
pedido.setPago(true);
repository.salvar(pedido);
Seis linhas pra criar UM pedido?
Aqui em baixo, a mesma coisa, escrita por alguém que leu alguma release note desde 2015:
var pedido = new Pedido("cliente-957", 189.50, List.of("Moqueca de Camarão", "Acarajé", "Cerveja Gelada"), true);
repository.salvar(pedido);
Ou, se você nem vai usar a variável depois, pra que gastar linha à toa?
repository.salvar(new Pedido("cliente-957", 189.50, List.of("Moqueca de Camarão", "Acarajé", "Cerveja Gelada"), true));
Uma linha. Resolvido. A gente se dá o trabalho de escrever seis linhas pra fazer o que uma só resolveria... Assim fica difícil defender a firma, né?
Ainda na máquina de escrever: Getters e Setters em 2025
Vamos trocar uma ideia sobre de onde vem essa tal "verbosidade". Spoiler: tá mais perto do que a gente imagina.
Se em pleno 2025 a gente ainda tá digitando getX() e setX() na mão, parece que a gente virou uma impressora de código. Os Records tão ai desde o Java 14, prontos pra jogo.
public record Pedido(String clienteId, double valorTotal, List<String> itens, boolean pago) {}
É só isso. A classe inteira. Já vem com construtor, getters, equals(), hashCode() e toString() no pacote. Mas se você curte digitar 50 linhas a mais, quem sou eu pra julgar?
Aquele medo do var porque "é confuso"
Confuso, sério? Confuso mesmo é se deparar com isso aqui:
Map<String, List<PedidoDetalhado>> pedidosAgrupadosPorRegiao = relatorioService.agruparPedidosPorRegiaoDoPais();
Quando a gente podia ter a paz de um:
var pedidosAgrupadosPorRegiao = relatorioService.agruparPedidosPorRegiaoDoPais();
O tipo da variável tá na cara, ali no nome do método. Se tirar a declaração explícita deixa o código "ilegível", talvez o problema não seja o var, e sim o nome do método, que não tá contando a história direito.
A coleção de patterns pra resolver coisinha simples
Quem nunca viu? UserFactory, UserBuilder, UserManager, UserService, UserHelper, UserUtil. Uma constelação de classes pra fazer o que um construtor e dois métodos dariam conta.
Design patterns são ferramentas poderosas pra resolver problemas complexos, e não pra enfeitar o currículo. Criar um Factory pra um objeto de 3 campos é tipo usar um canhão pra matar uma formiga.
Deixando as novidades da linguagem no vácuo
O Java se reinventou, e muito! Mas tem muito código por aí que parece ter parado em 2005. Se liga no que já tá rolando:
-
Switch expressions (Java 14): Um jeito muito mais elegante de lidar com múltiplas condições.
-
Text blocks (Java 15): Pra escrever JSON ou SQL no código sem aquele malabarismo com
+. -
Pattern matching para
instanceof(Java 16): Chega de fazer cast depois de verificar o tipo. -
Sealed classes (Java 17): Pra ter controle de quem pode herdar suas classes.
-
Record patterns (Java 21): Pra desestruturar objetos de um jeito super simples.
Isso tudo já tá aí, pronto pra usar e deixar nosso código bem mais enxuto. Vale a pena dar uma olhada nos changelogs!
O Java moderno tá o puro suco
Vamos ser sinceros: do Java 14 pra cá, a linguagem é outra parada:
// Records para representar dados, simples e direto
public record PassagemAerea(String origem, String destino, double preco) {}
// Switch inteligente para tratar diferentes tipos de notificação
String processarNotificacao(Object notificacao) {
return switch (notificacao) {
case Email(var dest, var ass) -> "Enviando email para " + dest + " sobre: " + ass;
case SMS(var num, var msg) -> "Enviando SMS para " + num;
case String s -> "Notificação de sistema: " + s;
case null, default -> "Tipo de notificação desconhecida";
};
}
// Text blocks para montar um JSON de um evento local
var payloadEvento = """
{
"nome": "Festa de São João",
"local": "Pelourinho, Salvador",
"data": "2025-06-23",
"atracoes": [
"Forró do Tico",
"Adelmário Coelho"
]
}
""";
// Streams para filtrar pedidos valiosos e já pagos
var pedidosValiosos = pedidos.stream()
.filter(p -> p.valorTotal() > 500.00 && p.pago())
.toList();
É verboso? Não. É claro? Sim. É moderno? Com certeza. A linguagem tá voando.
A verdade: a gente que complica
A real é que, na maioria das vezes, a "verbosidade" não é culpa do Java, mas sim de alguns hábitos que a gente pega:
-
A gente aprendeu Java lá em 2010 e esqueceu de ver as atualizações.
-
A gente repete uns padrões antigos do Spring como se fosse um mantra.
-
Às vezes a gente acha que código "enterprise" precisa ser complicado.
-
A gente nem sabia que o Java tinha ganhado tantos superpoderes.
-
Dá uma preguiça de refatorar, mas pra reclamar a gente tá sempre pronto.
A linguagem nos deu ferramentas incríveis. Só falta a gente começar a usar.
"Mas em outra linguagem é mais fácil!"
Ah, o clássico papo da grama do vizinho...
Sim, em Python você não precisa declarar o tipo. É legal, até o dia que sobe um bug pra produção porque você passou um texto onde era pra ser um número.
JavaScript? É conciso, sim. Mas também é aquele universo paralelo onde typeof null é "object" e "2" + 2 dá "22".
Go é minimalista de propósito, o que é ótimo... até você sentir falta de umas coisinhas básicas que eles levaram uma década pra adicionar.
Toda linguagem é uma escolha, com seus prós e contras. Java apostou na segurança, estabilidade e em deixar as coisas bem claras. Se isso soa como "verboso", talvez a gente só não curta muito a filosofia da linguagem, e tá tudo bem.
O fantasma do AbstractSingletonProxyFactoryBean
Aquele nome gigante do Spring que todo mundo usa pra zoar o Java? Sim, ele existe. Não, você não escreve aquilo. É coisa interna do framework, láaaaaaa das profundezas.
Culpar o Java por isso é o mesmo que culpar o português pelo "juridiquês" dos advogados. Hoje em dia, com Spring Boot, a gente escreve um código limpo e direto ao ponto que nem esse:
@RestController
@RequestMapping("/pedidos")
public class PedidoController {
private final PedidoRepository pedidoRepository;
public PedidoController(PedidoRepository pedidoRepository) {
this.pedidoRepository = pedidoRepository;
}
@GetMapping("/{id}")
public Pedido getPedido(@PathVariable Long id) {
return pedidoRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Pedido não encontrado"));
}
}
Cadê a complicação? Cadê os XMLs? Pois é, ficaram lá em 2008.
Aqueles null checks de museu...
E pra fechar, vamos falar dessa relíquia da programação defensiva:
public String getCodigoDeRastreio(Pedido pedido) {
if (pedido != null) {
if (pedido.getCodigoDeRastreio() != null) {
return pedido.getCodigoDeRastreio();
}
}
return "Não disponível";
}
Hoje em dia, a gente resolve isso com muito mais simplicidade:
public String getCodigoDeRastreio(Pedido pedido) {
return Optional.ofNullable(pedido)
.map(Pedido::getCodigoDeRastreio)
.orElse("Não disponível");
}
A ideia aqui não é apontar o dedo pra ninguém, muito pelo contrário. A real é que o Java evoluiu DEMAIS, e às vezes, na correria, a gente fica preso no jeito antigo de fazer as coisas.
Se a gente se der a chance de explorar as features mais novas, vai descobrir um mundo de possibilidades pra escrever um código mais limpo, mais rápido e, por que não, mais divertido.