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


🎯 Visão Geral dos Exemplos Práticos

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

  1. Benchmark de Eficiência de Strings: comparação de latência e alocação entre concatenação + e StringBuilder.
  2. Sistema de Autorização com Máscaras de Bits (Bitmasks): gerenciamento atômico de privilégios de segurança com operadores binários.
  3. Higienização e Parsing com Recursos Modernos de Texto: manipulação de Text Blocks e métodos de String do Java 11/17/21.

💻 Exemplo 01 — Análise Comparativa de Desempenho: Concatenação vs StringBuilder

package com.empresa.strings;

/**
 * Benchmark empírico comparando alocação e latência entre operador + e StringBuilder.
 */
public class BenchmarkStrings {

    private static final int ITERACOES = 20_000;

    public static void main(String[] args) {
        System.out.println("================================================================================");
        System.out.println("          BENCHMARK DE PERFORMANCE: STRING CONCAT (+) vs STRINGBUILDER          ");
        System.out.println("================================================================================");
        System.out.printf("Executando laço com %,d concatenações cumulativas...%n%n", ITERACOES);

        // 1. Concatenação com operador + (Gera novos objetos a cada iteração)
        long inicioConcat = System.nanoTime();
        String resultadoConcat = "";
        for (int i = 0; i < ITERACOES; i++) {
            resultadoConcat += "A";
        }
        long fimConcat = System.nanoTime();
        double duracaoConcatMs = (fimConcat - inicioConcat) / 1_000_000.0;

        // 2. Concatenação com StringBuilder pré-dimensionado
        long inicioBuilder = System.nanoTime();
        StringBuilder sb = new StringBuilder(ITERACOES);
        for (int i = 0; i < ITERACOES; i++) {
            sb.append("A");
        }
        String resultadoBuilder = sb.toString();
        long fimBuilder = System.nanoTime();
        double duracaoBuilderMs = (fimBuilder - inicioBuilder) / 1_000_000.0;

        System.out.printf("1. Concatenação com Operador (+) : %10.2f ms (Gera milhares de objetos na Heap)%n", duracaoConcatMs);
        System.out.printf("2. Concatenação com StringBuilder : %10.2f ms (Buffer único redimensionável)%n", duracaoBuilderMs);
        System.out.printf("🚀 Fator de Aceleração           : %.1fx mais rápido com StringBuilder!%n",
                duracaoConcatMs / Math.max(duracaoBuilderMs, 0.001));
        System.out.println("--------------------------------------------------------------------------------");
        System.out.printf("Consistência de Saída: %b (Comprimento final: %,d caracteres)%n",
                resultadoConcat.length() == resultadoBuilder.length(), resultadoBuilder.length());
        System.out.println("================================================================================");
    }
}

💻 Exemplo 02 — Gestor de Autorização e Privilégios com Operadores Bitwise

package com.empresa.strings;

/**
 * Gestor de controle de acesso (RBAC) ultra-rápido utilizando operações em nível de bits.
 */
public class GestorAcessoBitwise {

    // Níveis de privilégio mapeados em potências de 2
    public static final int PERM_VIEW      = 1 << 0; // 0000 0001 (1)
    public static final int PERM_EDIT      = 1 << 1; // 0000 0010 (2)
    public static final int PERM_DELETE    = 1 << 2; // 0000 0100 (4)
    public static final int PERM_PUBLISH   = 1 << 3; // 0000 1000 (8)
    public static final int PERM_AUDIT_LOG = 1 << 4; // 0001 0000 (16)

    public static boolean temPermissao(int mascaraUsuario, int permissaoRequerida) {
        return (mascaraUsuario & permissaoRequerida) == permissaoRequerida;
    }

    public static int concederPermissao(int mascaraUsuario, int permissao) {
        return mascaraUsuario | permissao; // OR bit a bit
    }

    public static int revogarPermissao(int mascaraUsuario, int permissao) {
        return mascaraUsuario & ~permissao; // AND com NOT binário
    }

    public static int alternarPermissao(int mascaraUsuario, int permissao) {
        return mascaraUsuario ^ permissao; // XOR binário
    }

    public static String descreverPermissoes(int mascara) {
        StringBuilder desc = new StringBuilder("[");
        if (temPermissao(mascara, PERM_VIEW)) desc.append("VIEW ");
        if (temPermissao(mascara, PERM_EDIT)) desc.append("EDIT ");
        if (temPermissao(mascara, PERM_DELETE)) desc.append("DELETE ");
        if (temPermissao(mascara, PERM_PUBLISH)) desc.append("PUBLISH ");
        if (temPermissao(mascara, PERM_AUDIT_LOG)) desc.append("AUDIT ");
        return desc.toString().stripTrailing() + "]";
    }

    public static void main(String[] args) {
        System.out.println("================================================================================");
        System.out.println("            SISTEMA DE AUTORIZAÇÃO E SEGURANÇA BASEADO EM BITS                  ");
        System.out.println("================================================================================");

        int perfilEditor = PERM_VIEW | PERM_EDIT | PERM_PUBLISH;
        System.out.printf("Perfil Editor Inicial : %s (Máscara Decimal: %d)%n", descreverPermissoes(perfilEditor), perfilEditor);

        System.out.printf("   Pode Visualizar?   : %b%n", temPermissao(perfilEditor, PERM_VIEW));
        System.out.printf("   Pode Deletar?      : %b%n", temPermissao(perfilEditor, PERM_DELETE));

        // Revogando permissão de publicação
        System.out.println("\n--- Revogando Permissão de PUBLISH ---");
        perfilEditor = revogarPermissao(perfilEditor, PERM_PUBLISH);
        System.out.printf("Perfil Atualizado     : %s%n", descreverPermissoes(perfilEditor));

        // Concedendo auditoria
        System.out.println("\n--- Concedendo Permissão de AUDIT_LOG ---");
        perfilEditor = concederPermissao(perfilEditor, PERM_AUDIT_LOG);
        System.out.printf("Perfil com Auditoria  : %s%n", descreverPermissoes(perfilEditor));
        System.out.println("================================================================================");
    }
}

📋 Resultado Esperado no Console

================================================================================
          BENCHMARK DE PERFORMANCE: STRING CONCAT (+) vs STRINGBUILDER          
================================================================================
Executando laço com 20,000 concatenações cumulativas...

1. Concatenação com Operador (+) :     148.50 ms (Gera milhares de objetos na Heap)
2. Concatenação com StringBuilder :       0.85 ms (Buffer único redimensionável)
🚀 Fator de Aceleração           : 174.7x mais rápido com StringBuilder!
--------------------------------------------------------------------------------
Consistência de Saída: true (Comprimento final: 20,000 caracteres)
================================================================================

================================================================================
            SISTEMA DE AUTORIZAÇÃO E SEGURANÇA BASEADO EM BITS                  
================================================================================
Perfil Editor Inicial : [VIEW EDIT PUBLISH] (Máscara Decimal: 11)
   Pode Visualizar?   : true
   Pode Deletar?      : false

--- Revogando Permissão de PUBLISH ---
Perfil Atualizado     : [VIEW EDIT]

--- Concedendo Permissão de AUDIT_LOG ---
Perfil com Auditoria  : [VIEW EDIT AUDIT]
================================================================================