Especialização em Sistemas com Java 21 LTS • Capítulo 01


🎯 Visão Geral dos Exemplos Práticos

Neste laboratório prático, implementaremos exemplos corporativos completos explorando:

  1. Inspeção de Runtime da JVM e Arquitetura de Execução: diagnóstico de memória heap, processadores lógicos e versão LTS.
  2. Processamento Sequencial Financeiro com BigDecimal: eliminação de erros de ponto flutuante IEEE 754 com precisão contábil e arredondamento HALF_EVEN.
  3. Entrada e Saída Formatada com Text Blocks e Locale: tratamento regional de dados, leitura sequencial e formatação tabular profissional.

💻 Exemplo 01 — Diagnóstico de Runtime e Especificações da JVM

Este programa inspeciona o ambiente de execução da JVM, demonstrando como recuperar metadados do sistema operacional, memória gerenciada e arquitetura do processador.

package com.empresa.fundamentos;

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;

/**
 * Diagnóstico de execução da Java Virtual Machine (JVM).
 */
public class DiagnosticoRuntimeJVM {

    public static void main(String[] args) {
        System.out.println("================================================================================");
        System.out.println("         DIAGNÓSTICO DO ECOSSISTEMA JAVA 21 LTS (RUNTIME ENVIRONMENT)           ");
        System.out.println("================================================================================");

        // Metadados da Linguagem e Fornecedor da JVM
        String versaoJava = System.getProperty("java.version");
        String vendorJava = System.getProperty("java.vendor");
        String nomeVm = System.getProperty("java.vm.name");
        String versaoVm = System.getProperty("java.vm.version");
        String osNome = System.getProperty("os.name");
        String osArch = System.getProperty("os.arch");

        System.out.printf("🔹 Java Specification / Version : %s (%s)%n", versaoJava, vendorJava);
        System.out.printf("🔹 VM Implementation            : %s (v%s)%n", nomeVm, versaoVm);
        System.out.printf("🔹 Sistema Operacional          : %s (%s)%n", osNome, osArch);

        // Recursos de Hardware alocados pela JVM
        Runtime runtime = Runtime.getRuntime();
        int nucleosDisponiveis = runtime.availableProcessors();
        long memoriaMaximaBytes = runtime.maxMemory();
        long memoriaTotalBytes = runtime.totalMemory();
        long memoriaLivreBytes = runtime.freeMemory();
        long memoriaUsadaBytes = memoriaTotalBytes - memoriaLivreBytes;

        double mbFactor = 1024.0 * 1024.0;

        System.out.println("--------------------------------------------------------------------------------");
        System.out.println("                     ALOCAÇÃO DE RECURSOS E MEMÓRIA HEAP                        ");
        System.out.println("--------------------------------------------------------------------------------");
        System.out.printf("⚙️  Processadores / Cores Lógicos : %d%n", nucleosDisponiveis);
        System.out.printf("🧠 Memória Heap Máxima (-Xmx)   : %8.2f MB%n", memoriaMaximaBytes / mbFactor);
        System.out.printf("🧠 Memória Heap Alocada Atual   : %8.2f MB%n", memoriaTotalBytes / mbFactor);
        System.out.printf("🧠 Memória Heap Efetivamente Usada: %8.2f MB%n", memoriaUsadaBytes / mbFactor);
        System.out.printf("🧠 Memória Heap Livre no Momento  : %8.2f MB%n", memoriaLivreBytes / mbFactor);

        // Verificação de Suporte a Virtual Threads (Java 21+)
        boolean virtualThreadsSuportadas = true;
        try {
            Thread.ofVirtual().name("vt-probe").start(() -> {}).join();
        } catch (Exception e) {
            virtualThreadsSuportadas = false;
        }

        System.out.printf("🚀 Suporte a Virtual Threads (Loom): %s%n", 
                virtualThreadsSuportadas ? "HABILITADO NATIVAMENTE" : "INDISPONÍVEL");
        System.out.println("================================================================================");
    }
}

💻 Exemplo 02 — Cálculo Financeiro e Estrutura Sequencial com BigDecimal

Demonstração do perigo de usar double para operações contábeis vs o uso rigoroso de java.math.BigDecimal com precisão arbitrária e regras de tributação sequenciais.

package com.empresa.fundamentos;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Locale;

/**
 * Sistema de liquidação contábil com validação de precisão numérica.
 */
public class LiquidacaoFinanceiraSequencial {

    // Alíquotas e tetos parametrizados
    public static final BigDecimal ALIQUOTA_INSS = new BigDecimal("0.1100"); // 11%
    public static final BigDecimal ALIQUOTA_IRRF = new BigDecimal("0.0750"); // 7.5%
    public static final BigDecimal PARCELA_DEDUTIVEL_IRRF = new BigDecimal("158.40");
    public static final BigDecimal AUXILIO_ALIMENTACAO_DIARIO = new BigDecimal("32.50");

    public static void main(String[] args) {
        Locale.setDefault(Locale.US);

        System.out.println("================================================================================");
        System.out.println("          PROCESSAMENTO SEQUENCIAL: FOLHA DE PAGAMENTO CORPORATIVA             ");
        System.out.println("================================================================================");

        // Dados de Entrada (Entidades primitivas e objetos imutáveis)
        final String matricula = "CORP-84920";
        final String nomeColaborador = "Beatriz Helena Siqueira";
        final int diasTrabalhados = 22;
        final BigDecimal salarioContratual = new BigDecimal("7850.00");

        // 1. Alíquota proporcional por dias úteis no mês (base 22 dias comerciais)
        BigDecimal fatorDias = new BigDecimal(diasTrabalhados)
                .divide(new BigDecimal("22"), 6, RoundingMode.HALF_EVEN);
        BigDecimal proventoBruto = salarioContratual.multiply(fatorDias).setScale(2, RoundingMode.HALF_EVEN);

        // 2. Benefício de alimentação proporcional
        BigDecimal beneficioAlimentacao = AUXILIO_ALIMENTACAO_DIARIO
                .multiply(new BigDecimal(diasTrabalhados)).setScale(2, RoundingMode.HALF_EVEN);

        // 3. Dedução do INSS
        BigDecimal descontoInss = proventoBruto.multiply(ALIQUOTA_INSS).setScale(2, RoundingMode.HALF_EVEN);

        // 4. Base de cálculo do IRRF (Bruto - INSS)
        BigDecimal baseCalculoIrrf = proventoBruto.subtract(descontoInss);
        BigDecimal descontoIrrf = baseCalculoIrrf.multiply(ALIQUOTA_IRRF)
                .subtract(PARCELA_DEDUTIVEL_IRRF)
                .setScale(2, RoundingMode.HALF_EVEN);

        // 5. Total de Descontos e Líquido
        BigDecimal totalDescontos = descontoInss.add(descontoIrrf);
        BigDecimal salarioLiquido = proventoBruto.subtract(totalDescontos).add(beneficioAlimentacao);

        // Emissão do Holerite Tabular via Text Blocks
        String demonstrativo = """
        Matrícula do Funcionário : %s
        Colaborador              : %s
        Dias Úteis Apurados      : %d dias
        --------------------------------------------------------------------------------
        (+) Salário Bruto        : R$ %10.2f
        (+) Vale Alimentação     : R$ %10.2f
        (-) Dedução INSS (11.0%%) : R$ %10.2f
        (-) Dedução IRRF (7.5%%)  : R$ %10.2f
        --------------------------------------------------------------------------------
        TOTAL DE DESCONTOS       : R$ %10.2f
        LÍQUIDO A RECEBER        : R$ %10.2f
        ================================================================================
        """.formatted(
                matricula,
                nomeColaborador,
                diasTrabalhados,
                proventoBruto,
                beneficioAlimentacao,
                descontoInss,
                descontoIrrf,
                totalDescontos,
                salarioLiquido
        );

        System.out.print(demonstrativo);
    }
}

💻 Exemplo 03 — I/O Formatado e Parsing de Tipos Primitivos

Demonstração do tratamento robusto de entrada com Scanner, prevenindo problemas clássicos de consumo de quebra de linha (\n) e formatação com locale brasileiro vs americano.

package com.empresa.fundamentos;

import java.util.Locale;
import java.util.Scanner;

/**
 * Demonstração de leitura estruturada, conversão e parsing seguro.
 */
public class LeituraTipadaSegura {

    public static void main(String[] args) {
        // Simulação de fluxo de dados em formato CSV delimitado por ponto e vírgula
        String dadosEntrada = """
                10492;Servidor Dell PowerEdge R750;3;48750.80;true
                10493;Switch Cisco Catalyst 9300;2;14200.50;false
                """;

        Scanner sc = new Scanner(dadosEntrada);
        sc.useLocale(Locale.US);

        System.out.println("================================================================================");
        System.out.println("                  PARSING E PROCESSAMENTO SEQUENCIAL DE FLUXO                   ");
        System.out.println("================================================================================");
        System.out.printf("%-8s | %-30s | %-4s | %-12s | %-10s%n", 
                "CÓDIGO", "EQUIPAMENTO", "QTD", "UNITÁRIO", "CRÍTICO");
        System.out.println("--------------------------------------------------------------------------------");

        double totalInventario = 0.0;

        while (sc.hasNextLine()) {
            String linha = sc.nextLine().trim();
            if (linha.isEmpty()) continue;

            String[] tokens = linha.split(";");
            int codigo = Integer.parseInt(tokens[0]);
            String descricao = tokens[1];
            int quantidade = Integer.parseInt(tokens[2]);
            double valorUnitario = Double.parseDouble(tokens[3]);
            boolean critico = Boolean.parseBoolean(tokens[4]);

            double subtotal = quantidade * valorUnitario;
            totalInventario += subtotal;

            System.out.printf("%08d | %-30s | %4d | R$ %10.2f | %-10s%n",
                    codigo, descricao, quantidade, valorUnitario, critico ? "SIM [URGENTE]" : "NÃO");
        }

        System.out.println("--------------------------------------------------------------------------------");
        System.out.printf("VALOR TOTAL DO INVENTÁRIO APURADO: R$ %,.2f%n", totalInventario);
        System.out.println("================================================================================");
        sc.close();
    }
}

📋 Resultado Esperado no Console

================================================================================
         DIAGNÓSTICO DO ECOSSISTEMA JAVA 21 LTS (RUNTIME ENVIRONMENT)           
================================================================================
🔹 Java Specification / Version : 21.0.2 (Oracle Corporation)
🔹 VM Implementation            : OpenJDK 64-Bit Server VM (v21.0.2+13-58)
🔹 Sistema Operacional          : Windows 11 (amd64)
--------------------------------------------------------------------------------
                     ALOCAÇÃO DE RECURSOS E MEMÓRIA HEAP                        
--------------------------------------------------------------------------------
⚙️  Processadores / Cores Lógicos : 16
🧠 Memória Heap Máxima (-Xmx)   :  4096.00 MB
🧠 Memória Heap Alocada Atual   :   256.00 MB
🧠 Memória Heap Efetivamente Usada:   12.45 MB
🧠 Memória Heap Livre no Momento  :   243.55 MB
🚀 Suporte a Virtual Threads (Loom): HABILITADO NATIVAMENTE
================================================================================

================================================================================
          PROCESSAMENTO SEQUENCIAL: FOLHA DE PAGAMENTO CORPORATIVA             
================================================================================
Matrícula do Funcionário : CORP-84920
Colaborador              : Beatriz Helena Siqueira
Dias Úteis Apurados      : 22 dias
--------------------------------------------------------------------------------
(+) Salário Bruto        : R$    7850.00
(+) Vale Alimentação     : R$     715.00
(-) Dedução INSS (11.0%) : R$     863.50
(-) Dedução IRRF (7.5%)  : R$     365.59
--------------------------------------------------------------------------------
TOTAL DE DESCONTOS       : R$    1229.09
LÍQUIDO A RECEBER        : R$    7335.91
================================================================================