image

Bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Article image

BS

Beatriz Santos13/10/2025 21:35
Compartilhe

Boas Práticas e Fundamentos de Java: da Orientação a Objetos à Stream API e Aplicações Contemporânea

    Introdução

    Criada por James Gosling nos anos 1990, Java segue como uma das linguagens mais relevantes do mundo, presente em aplicações corporativas, mobile, nuvem, IoT e Inteligência Artificial (IA).

    O segredo do sucesso da linguagem está na JVM (Java Virtual Machine), na filosofia “escreva uma vez, rode em qualquer lugar” e na evolução contínua — especialmente nas versões Java 17 e Java 21 (LTS), que trouxeram Virtual Threads, Pattern Matching e uma API moderna de memória.

    Segundo o State of Developer Ecosystem da JetBrains (2025), o Java segue entre as linguagens mais usadas globalmente, com ampla base de desenvolvedores e forte presença em sistemas corporativos, aplicações web e soluções em nuvem. Sua popularidade e estabilidade tornam-no uma escolha estratégica para projetos de missão crítica.

    Este artigo foi inspirado pelos desafios práticos da comunidade DIO, onde milhares de desenvolvedores aprendem e compartilham conhecimento em Java. Ele busca servir como guia para quem deseja evoluir na linguagem e aplicar seus recursos mais modernos.

    Neste artigo, você encontrará explicações conceituais e exemplos práticos sobre:

    • ⚙️ Fundamentos e boas práticas de desenvolvimento em Java
    • 🔁 Uso da Stream API para processamento moderno
    • 🚀 Inovações do Java 21 e suas aplicações reais
    • 🤖 Integração entre Java e IA, com frameworks reais
    • 🧩 Exemplos que mostram por que Java ainda molda o futuro da programação

    1. Fundamentos e Boas Práticas

    1.1 Programação Orientada a Objetos (POO)

    A POO é o paradigma central do Java e um dos motivos pelo qual a linguagem permanece tão poderosa e duradoura.

    Diferente da programação estruturada — que separa funções e dados — a POO organiza o software em torno de objetos, que representam elementos do mundo real com atributos (dados) e métodos (ações).

    📘 Em termos simples:

    Um objeto é uma entidade que combina dados e comportamento, funcionando como um “molde digital” do mundo real.

    1.1.1 Os 4 Pilares da POO

    1.1.1.1 Abstração 🧩

    A abstração foca apenas nos detalhes essenciais de um objeto, ignorando o que não importa para o contexto. Isso facilita a manutenção e reduz acoplamento entre módulos.

    Exemplo: ao programar uma classe Carro, nos interessam ações como acelerar e frear, mas não “como o combustível queima”:

    public class Carro {
      void acelerar() { System.out.println("Acelerando..."); }
      void frear() { System.out.println("Parando..."); }
    }
    
    1.1.1.2 Encapsulamento 🔒

    Protege os dados internos de um objeto, permitindo acesso apenas por métodos controlados (getters e setters). Isso ajuda a garantir invariantes e regras de negócio.

    public class Conta {
      private double saldo;
    
      public void depositar(double valor) {
          if (valor > 0) saldo += valor;
      }
    
      public double getSaldo() {
          return saldo;
      }
    }
    

    🧠 Encapsulamento melhora previsibilidade e segurança do sistema.

    1.1.1.3 Herança 🧬

    Permite que uma classe herde atributos e métodos de outra, promovendo reutilização de código e padronização de comportamento.

    public class Funcionario {
      String nome;
      double salario;
    }
    
    public class Gerente extends Funcionario {
      double bonus;
    }
    

    💡 Dica: prefira composição quando aplicável para evitar hierarquias fracas.

    1.1.1.4 Polimorfismo 🎭

    Permite que um mesmo método se comporte de forma diferente conforme o tipo real do objeto. No mundo real, isso facilita extensibilidade — por exemplo, novos tipos podem ser adicionados sem alterar o código que depende da abstração.

    public class Animal {
      void emitirSom() { System.out.println("Som genérico"); }
    }
    
    public class Cachorro extends Animal {
      @Override
      void emitirSom() { System.out.println("Latindo..."); }
    }
    
    public class Gato extends Animal {
      @Override
      void emitirSom() { System.out.println("Miando..."); }
    }
    
    1.1.1.5 Por que usar POO em Java?
    • Reutilização de código — herança e abstração reduzem redundâncias
    • Manutenção facilitada — alterações localizadas
    • Modularidade — separação clara de responsabilidades
    • Escalabilidade — adequada para APIs, microsserviços e sistemas corporativos
    • Integração com frameworks — Spring Boot, Hibernate, Jakarta EE etc.

    📊 Um estudo da Eclipse Foundation (2024) mostra que muitos desenvolvedores Java destacam a modularidade e clareza proporcionadas pela POO (referência ao relatório da Eclipse Foundation sobre uso de tecnologias Java). (The JetBrains Blog)

    1.1.2 POO na Prática: Mini-sistema bancário

    abstract class Conta {
      protected double saldo;
    
      public void depositar(double valor) { saldo += valor; }
      public abstract void sacar(double valor);
    }
    
    class ContaCorrente extends Conta {
      private double limite = 500.0;
    
      @Override
      public void sacar(double valor) {
          if (saldo + limite >= valor) saldo -= valor;
          else throw new IllegalArgumentException("Saldo insuficiente");
      }
    }
    
    class ContaPoupanca extends Conta {
      @Override
      public void sacar(double valor) {
          if (saldo >= valor) saldo -= valor;
          else throw new IllegalArgumentException("Saldo insuficiente");
      }
    }
    

    🔍 Em resumo: Conta é a abstração; ContaCorrente e ContaPoupanca implementam regras específicas (limite, regras de saque). Isso demonstra encapsulamento, herança e polimorfismo em ação.

    1.2 Código Limpo e Legibilidade

    Segundo Robert C. Martin (Clean Code, 2008), código legível é um ativo: facilita manutenção, revisão e onboarding. Use nomes claros, evite duplicação (DRY) e documente com Javadoc.

    /**
     * Classe que representa um aluno.
     */
    public class Aluno { ... }
    

    Boas práticas reduzem bugs e aceleram entrega.

    2. Stream API: Processamento Declarativo e Paralelismo

    A Stream API (Java 8) trouxe um estilo declarativo ao processamento de coleções, favorecendo operações encadeadas (map, filter, reduce) e possibilitando paralelismo controlado.

    List<String> nomes = List.of("Beatriz", "Ana", "Bruno", "Bianca");
    
    List<String> filtrados = nomes.stream()
      .filter(n -> n.startsWith("B"))
      .map(String::toUpperCase)
      .sorted()
      .collect(Collectors.toList());
    
    filtrados.forEach(System.out::println);
    

    💡 Saída:

    BEATRIZ
    BIANCA
    BRUNO
    

    A literatura técnica mostra que, em cenários pequenos, streams podem ter overheads; já em conjuntos grandes e com paralelização correta, o ganho é claro. O estudo Profiling and Optimizing Java Streams discute esses custos e técnicas de otimização. (arXiv)

    Dica prática: meça desempenho com JMH (Java Microbenchmark Harness) antes de otimizar prematuramente.

    3. Java 21: Inovações que Moldam o Presente

    O JDK 21 e os JEPs associados seguem embasando melhorias de produtividade e performance da plataforma. Recursos como Virtual Threads e a Foreign Function & Memory API são marcos para aplicações modernas. (ver JEPs oficiais). (OpenJDK)

    3.1 Virtual Threads (JEP 444)

    Virtual Threads simplificam a construção de servidores de alta concorrência sem a sobrecarga tradicional de threads do sistema operacional. A documentação oficial detalha os objetivos e modelos de uso prático. (OpenJDK)

    try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
      IntStream.range(0, 1000).forEach(i ->
          executor.submit(() -> {
              Thread.sleep(100);
              System.out.println("Thread virtual: " + i);
          })
      );
    }
    

    3.2 Pattern Matching e Record Patterns (JEP 440)

    Simplificam checagens e extração de dados, reduzindo boilerplate e melhorando legibilidade.

    3.3 Foreign Function & Memory API (JEP 454)

    Substitui (em muitos casos) o uso direto de JNI, oferecendo API segura para interoperabilidade com C/C++ e bibliotecas nativas — útil para integração com bibliotecas de ML/IA de alto desempenho. (OpenJDK)

    4. Java e Inteligência Artificial

    Java evoluiu para suportar IA de forma prática: bibliotecas e frameworks permitem treinar, inferir e integrar modelos em aplicações corporativas.

    4.1 Principais Frameworks

    image

    Fonte: elaborada pela autora (2025).

    Exemplo DJL

    riteria<Image, Classifications> criteria = Criteria.builder()
      .optApplication(Application.CV.IMAGE_CLASSIFICATION)
      .setTypes(Image.class, Classifications.class)
      .optModelUrls("djl://ai/djl/zoo")
      .build();
    
    try (ZooModel<Image, Classifications> model = ModelZoo.loadModel(criteria)) {
      System.out.println("Modelo carregado com sucesso!");
    }
    

    4.2 Casos Reais e Modernização

    Projetos de modernização de legado para Java e integração com IA têm sido adotados por empresas que usam assistentes de código e automação.

    A IBM documenta casos e ferramentas (watsonx / Code Assistant) para acelerar transformação e modernização de aplicações Java legadas. (IBM)

    No Brasil, bancos digitais e fintechs (ex.: Nubank, C6) usam Java em back-ends de alta performance para análise em tempo real, prevenção de fraudes e recomendações — mostrando que Java ainda é uma escolha pragmática para sistemas críticos.

    📊 Observação: a adoção de ferramentas de IA no fluxo de desenvolvimento cresceu bastante; a pesquisa da Stack Overflow mostra aumento expressivo no uso/planejamento de AI tools entre devs (dados 2024). (Stack Overflow)

    5. Java em Aplicações Modernas

    5.1 Chatbots e Assistentes Virtuais

    @RestController
    public class ChatController {
      @PostMapping("/mensagem")
      public String responder(@RequestBody String pergunta) throws IOException, InterruptedException {
          var client = HttpClient.newHttpClient();
          var request = HttpRequest.newBuilder()
              .uri(URI.create("https://api.openai.com/v1/chat/completions"))
              .header("Content-Type", "application/json")
              .header("Authorization", "Bearer SUA_CHAVE_API")
              .POST(HttpRequest.BodyPublishers.ofString("""
                  {
                      "model": "gpt-4",
                      "messages": [{"role": "user", "content": "%s"}]
                  }
              """.formatted(pergunta)))
              .build();
    
          var response = client.send(request, HttpResponse.BodyHandlers.ofString());
          return response.body();
      }
    }
    

    Boas práticas: armazene chaves em variáveis de ambiente, trate exceções e registre logs de forma estruturada.

    5.2 Processamento de Dados em Tempo Real

    Soluções como Apache Kafka Streams, Apache Flink e Spring Cloud Stream são líderes no processamento em tempo real, normalmente integradas a arquiteturas de microsserviços e bancos NoSQL para painéis de baixo latency.

    6. Conclusão

    Java não é somente uma linguagem, é um ecossistema de pensamento computacional. Desde os fundamentos estruturais até as inovações da Stream API, o aprendizado de Java conduz o estudante à organização mental e ao raciocínio lógico que sustentam toda a ciência da programação.

    A robustez, portabilidade e simplicidade, destacadas por Claro e Sobral (2008) e Chagas et al. (2010), continuam a fazer de Java um dos pilares da computação moderna.

    Mesmo após mais de trinta anos, a linguagem mantém sua vitalidade — ensinando não apenas a programar, mas a pensar como um programador.

    💡 Aprender Java é entender como conciliar tradição e reinvenção — dominar princípios sólidos (POO, código limpo) e experimentar recursos modernos (Streams, Virtual Threads, FFM).

    Além disso, o aprendizado e compartilhamento na comunidade DIO potencializam a prática, networking e oportunidades de carreira.

    💬 Interaja com a Comunidade

    Agora é com você! 🚀

    Qual conceito de Java você mais aplica ou ainda te desafia?

    Deixe seu comentário e compartilhe sua experiência — isso gera networking, troca de conhecimento e pode abrir oportunidades.

    📚 Referências Bibliográficas

    Rosales, E.; Basso, M.; Rosà, A.; Binder, W. (2023). Profiling and Optimizing Java Streams. arXiv:2302.10006. Disponível em: https://arxiv.org/abs/2302.10006. Acesso em: 13 out. 2025.

    OpenJDK. (2023). JEP 444 – Virtual Threads. Disponível em: https://openjdk.org/jeps/444. Acesso em: 13 out. 2025.

    OpenJDK. (2023). JEP 454 – Foreign Function & Memory API. Disponível em: https://openjdk.org/jeps/454. Acesso em: 13 out. 2025.

    Oracle. (2023). Virtual Threads — Java SE Documentation. Disponível em: https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html. Acesso em: 13 out. 2025.

    IBM. (2024–2025). Java Modernization Use Case – IBM watsonx Code Assistant. Disponível em: https://www.ibm.com/products/watsonx-code-assistant/java-modernization. Acesso em: 13 out. 2025.

    IBM. (2024–2025). Accelerating Java Modernization with IBM watsonx Code Assistant (Blog). Disponível em: https://www.ibm.com/products/blog/accelerating-java-modernization-watsonx-code-assistant. Acesso em: 13 out. 2025.

    IBM. (2024–2025). Modernizing Java Applications – IBM watsonx Code Assistant (Docs). Disponível em: https://cloud.ibm.com/docs/watsonx-code-assistant?topic=watsonx-code-assistant-wca-modernize-java. Acesso em: 13 out. 2025.

    JetBrains. (2024/2025). State of Developer Ecosystem / Data Playground. Disponível em: https://www.jetbrains.com/lp/devecosystem-2024/ | https://www.jetbrains.com/lp/devecosystem-data-playground/. Acesso em: 13 out. 2025.

    Stack Overflow. (2024). Developer Survey 2024 — AI & Technology sections. Disponível em: https://survey.stackoverflow.co/2024/. Acesso em: 13 out. 2025.

    Eclipse Foundation. (2023). Deeplearning4j Case Studies. Disponível em: https://deeplearning4j.konduit.ai/. Acesso em: 13 out. 2025.

    InfoWorld. (2023). Intro to virtual threads: A new approach to Java concurrency. Disponível em: https://www.infoworld.com/article/2337208/intro-to-virtual-threads-a-new-approach-to-java-concurrency.html. Acesso em: 13 out. 2025.

    InfoWorld. (2023). JDK 21: The new features in Java 21. Disponível em: https://www.infoworld.com/article/2338097/jdk-21-the-new-features-in-java-21.html. Acesso em: 13 out. 2025.

    Martin, R. C. (2008). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall.

    Gamma, E.; Helm, R.; Johnson, R.; Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley.

    Bloch, J. (2018). Effective Java (3rd Edition). Addison-Wesley.

    Baeldung. (2024). Java Tutorials and Guides. Disponível em: https://www.baeldung.com/. Acesso em: 13 out. 2025.

    Compartilhe
    Recomendados para você
    Cognizant - Mobile Developer
    Luizalabs - Back-end com Python
    PcD Tech Bradesco - Java & QA Developer
    Comentários (0)