💻 Exemplos: Capítulo 01: Ecossistema Java 21 LTS, JVM, Tipagem Primitiva e Estrutura Sequencial
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:
- Inspeção de Runtime da JVM e Arquitetura de Execução: diagnóstico de memória heap, processadores lógicos e versão LTS.
- Processamento Sequencial Financeiro com
BigDecimal: eliminação de erros de ponto flutuante IEEE 754 com precisão contábil e arredondamentoHALF_EVEN. - 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
================================================================================