image

Access unlimited bootcamps and 650+ courses forever

75
%OFF
Article image
Leandro Stampini
Leandro Stampini09/12/2025 13:43
Share

Dominando os Fundamentos de Java: Do "Hello World" à Qualidade de Código Profissional

    Olá, comunidade DIO!

    Quem navega pelas vagas de tecnologia sabe: Java continua sendo um pilar em posições de backend, QA automation, microsserviços e até em projetos de nuvem e mensageria. Mostrar que você domina os fundamentos não é apenas sobre sintaxe, mas sobre passar a mensagem de que consegue entrar em um código legado, entender o que está acontecendo e contribuir com qualidade.

    Um ponto forte de Java é a combinação de orientação a objetos, tipagem forte e um ecossistema maduro. Isso ajuda tanto quem está começando quanto quem quer crescer como dev ou QA, porque facilita a criação de código testável e a manutenção de projetos grandes em equipe.

    Estrutura Básica: O Ponto de Partida de Todo Dev Java

    Começamos pelo clássico, mas já com uma visão de quem pensa em código limpo e organizado.

    java
    public class HelloDio {
      public static void main(String[] args) {
          System.out.println("Olá, comunidade DIO!");
      }
    }
    

    Aqui já destacamos fundamentos cruciais:

    • public class HelloDio: A definição de uma classe pública, que segue a convenção de nomenclatura PascalCase, essencial para a legibilidade.
    • public static void main(String[] args): O ponto de entrada da aplicação, o método que a JVM (Java Virtual Machine) procura para iniciar o programa.
    • System.out.println(...): Uma saída padrão, útil para logs simples e depuração inicial.

    Claro, esse é apenas o ponto de partida. No dia a dia de um projeto real, raramente paramos em um Hello World, mas entender essa estrutura é a base para construir as classes complexas que resolvem problemas de negócio.

    Trabalhando com Tipos e Variáveis

    Java é uma linguagem fortemente tipada, o que significa que a escolha do tipo de dado impacta diretamente a performance e o uso de memória. Usar nomes de variáveis descritivos, como quantidadeUsuarios, não é apenas uma boa prática: é essencial para a manutenção e para facilitar os testes.

    java
    public class TiposBasicos {
      public static void main(String[] args) {
          int quantidadeUsuarios = 150;
          double taxaConversao = 3.7;
          boolean recursoAtivo = true;
          char tipoPlano = 'A';
    
          System.out.println("Usuários: " + quantidadeUsuarios);
          System.out.println("Taxa de conversão: " + taxaConversao + "%");
          System.out.println("Recurso ativo? " + recursoAtivo);
          System.out.println("Tipo de plano: " + tipoPlano);
      }
    }
    

    Em projetos reais, esses valores raramente são fixos no código (hardcoded). Eles são dinâmicos, vindos de bancos de dados, respostas de APIs ou arquivos de configuração, e o uso de tipos primitivos (intdoubleboolean) ajuda a garantir a eficiência.

    Orientação a Objetos na Prática

    Em vez de apenas listar os quatro pilares da POO, vamos ver como eles se conectam com o que as empresas realmente usam.

    java
    public class Cliente {
      private String nome;
      private String email;
    
      public Cliente(String nome, String email) {
          this.nome = nome;
          this.email = email;
      }
    
      public String getNome() { return nome; }
      public String getEmail() { return email; }
    
      public void atualizarEmail(String novoEmail) {
          this.email = novoEmail;
      }
    }
    
    java
    public class ClienteService {
      public void notificar(Cliente cliente, String mensagem) {
          System.out.println("Enviando mensagem para " + cliente.getEmail() + ": " + mensagem);
      }
    }
    
    java
    public class App {
      public static void main(String[] args) {
          Cliente cliente = new Cliente("Ana", "ana@dio.me");
          ClienteService service = new ClienteService();
    
          service.notificar(cliente, "Bem-vinda ao seu novo projeto Java na DIO!");
      }
    }
    

    Este exemplo demonstra conceitos-chave na prática. O encapsulamento protege os dados da classe Cliente, expondo-os apenas através de métodos públicos (getters e setters). Além disso, aplicamos a separação de responsabilidades, onde Cliente apenas modela os dados do domínio, enquanto ClienteService cuida da regra de negócio (a notificação). Esse tipo de modelagem é extremamente comum e se aproxima muito de como APIs REST e sistemas de back-office são construídos em projetos corporativos.

    Coleções e Fluxo de Dados

    Coleções aparecem em praticamente toda vaga de Java. Um exemplo simples, mas com "cara" de código de negócio, mostra que você entende como manipular conjuntos de dados.

    java
    import java.util.ArrayList;
    import java.util.List;
    
    public class ListaCursosDio {
      public static void main(String[] args) {
          List<String> cursos = new ArrayList<>();
          cursos.add("Java Fundamentals");
          cursos.add("Spring Boot");
          cursos.add("QA Automation com Java");
          cursos.add("Microsserviços na prática");
    
          System.out.println("--- Cursos Disponíveis ---");
          for (String curso : cursos) {
              System.out.println(curso);
          }
    
          long cursosComJava = cursos.stream()
                  .filter(curso -> curso.toLowerCase().contains("java"))
                  .count();
    
          System.out.println("\nTotal de cursos relacionados a Java: " + cursosComJava);
      }
    }
    

    Este código destaca práticas modernas e eficientes. Usamos uma List para manter uma coleção ordenada, e o laço for-each oferece uma leitura simples. O grande destaque é o uso da Stream API (a partir do Java 8), que com filter e count permite processar a coleção de forma declarativa e elegante, algo muito valorizado no mercado.

    Tratamento de Exceções com Foco em Robustez

    Um bom desenvolvedor não ignora erros; ele os antecipa. O tratamento de exceções com try-catch é fundamental para criar aplicações que não "quebram" inesperadamente.

    java
    public class ConversorNumero {
      public static void main(String[] args) {
          String entrada = "123a";
    
          try {
              int numero = Integer.parseInt(entrada);
              System.out.println("Número convertido: " + numero);
          } catch (NumberFormatException e) {
              System.err.println("Erro: A entrada '" + entrada + "' não é um número válido.");
              // Em um sistema de produção, aqui chamaríamos um logger:
              // log.error("Falha ao converter a entrada: {}", entrada, e);
          }
      }
    }
    

    Em um sistema de produção, a linha System.err.println seria substituída por uma chamada a um framework de logging (como Log4j ou SLF4J). Registrar o erro de forma estruturada é crucial para o monitoramento, depuração e análise de causa raiz em ambientes corporativos. Isso mostra a um recrutador que você pensa na saúde da aplicação a longo prazo.

    Share
    Recommended for you
    GitHub Copilot - Código na Prática
    CI&T - Backend com Java & AWS
    Nexa - Machine Learning e GenAI na Prática
    Comments (2)
    DIO Community
    DIO Community - 09/12/2025 14:03

    Excelente, Leandro! Que artigo cirúrgico, inspirador e essencial! Você tocou no ponto crucial do Desenvolvimento Java Backend: o domínio dos fundamentos é o que passa a mensagem de que você é um profissional capaz de entender código legado e contribuir com qualidade.

    É fascinante ver como você aborda o tema, mostrando que o Java exige disciplina para a modelagem de objetos e a separação de responsabilidades.

    Qual você diria que é o maior desafio para um desenvolvedor ao migrar um sistema de core banking para uma arquitetura cloud-native, em termos de segurança e de conformidade com as regulamentações, em vez de apenas focar em custos?

    Ruth Santos
    Ruth Santos - 09/12/2025 14:03

    Perfeito Leandro!!!!