Fundamentos de Java: o guia rápido que gera discussão 👇🤔
- #Java
Começando em Java ou revisando a base? Separei os 4 temas que mais rendem dúvidas na prática — com dicas curtas e exemplos que cabem no seu dia a dia. Deixa tua visão nos comentários e bora debater.
1) Primeiros passos e boas práticas com Java
- JDK & Build: instale o OpenJDK 17+ e use Maven ou Gradle desde o início.
- Projeto mínimo:
src/main/java
+ testes com JUnit. - Legibilidade > “truques”: nomes claros, métodos curtos, uma responsabilidade.
- Imutabilidade por padrão:
record
, coleções não mutáveis,final
quando fizer sentido. - I/O moderno: prefira
java.nio.file.Files.readString(Path)
aoFile
antigo. - Memória: objetos no heap, variáveis locais no stack; GC cuida do resto.
- JVM em uma foto:
class loader + execution engine (intérprete/JIT) + GC.
Mini-exemplo
public record Produto(String nome, BigDecimal preco) {}
Menos boilerplate, mais segurança.
2) Orientação a Objetos com Java (OOP)
- Encapsulamento: esconda detalhes; exponha intenções.
- Abstração: foque no “o que”; implemente o “como” internamente.
- Herança: útil, mas composição primeiro.
- Polimorfismo: código cliente fala com o tipo pai, a execução chama o filho certo.
Dica prática
Use interfaces com default methods para contratos estáveis e records para dados imutáveis.
Quando precisar variar comportamento, injete dependências (evita switch gigantes).
3) Erros comuns de iniciantes (e como evitar)
NullPointerException
: retorne coleções vazias; valide entradas; considereOptional
para ausência legítima.- Escolha errada de coleção:
- acesso rápido →
ArrayList
; - chave/valor →
HashMap
; - ordenação →
TreeMap/TreeSet
. - Manipular dinheiro com
double
: use BigDecimal comMathContext
. - Engolir exceções: registre com contexto; try-with-resources sempre em I/O.
- Sincronização manual prematura: prefira Executors, ConcurrentHashMap, BlockingQueue.
- Streams mal usadas: mutabilidade compartilhada dentro do pipeline — não faça (veja abaixo).
4) O que é a Java Stream API (e por que usar)
Streams são pipelines declarativos: fonte → operações intermediárias (lazy) → operação terminal.
Exemplo expressivo
var nomes = List.of("Ana","Lia","Zé","Letícia");
var resultado = nomes.stream()
.filter(n -> n.length() > 2)
.map(String::toUpperCase)
.sorted()
.toList();
Boas práticas com Streams
- Evite estado mutável externo ao pipeline.
- Prefira métodos puros (
map
,filter
) e collectors prontos (joining
,groupingBy
). - Parallel streams com cuidado: só valem quando a fonte é grande e “splittable”.
Referências rápidas (citadas)
- The Java™ Tutorials — Oracle
- Java Language Specification (JLS)
- OpenJDK Docs — HotSpot/JIT &
java.util.stream
Curtiu? Salva e marca alguém que está começando em Java.