Pular para o conteúdo
Início » Entendendo e Utilizando Records em Java

Entendendo e Utilizando Records em Java

Introdução

Com a chegada dos Records no Java 14 e seu aprimoramento na versão 16, a linguagem Java ofereceu aos desenvolvedores uma forma mais enxuta e eficaz de modelar dados imutáveis. Esta funcionalidade moderniza o código Java, permitindo declarações de tipos de dados com menos cerimônia e mais clareza. Neste artigo, vamos desvendar o potencial dos Records, explorando quando e como utilizá-los para beneficiar seus projetos.

O que são Records em Java?

Os Records talvez representam uma das mudanças mais significativas no que diz respeito à declaração de tipos em Java nos últimos tempos. Um Record é uma espécie de tipo de dado que facilita a modelagem de classes de dados puramente imutáveis – são essencialmente classes finais com campos finais que requerem menos boilerplate para sua criação.

Esta “nova” construção da linguagem Java é otimizada para armazenar dados de forma compacta e eficiente. Ao contrário das classes tradicionais, um Record automaticamente fornece uma implementação de métodos essenciais, como equals(), hashCode(), e toString(), que são congruentes com o estado do Record, economizando tempo e evitando erros comuns.

Quando usar Records?

Os Records são ideais quando você precisa de uma classe cujo principal objetivo é comunicar dados de forma transparente e imutável. Por exemplo, eles são perfeitos para passar informações entre camadas de uma aplicação, como dados de transferência de objetos (DTOs), ou para representar linhas de um resultado de banco de dados.

No entanto, se a sua estrutura de dados requer lógica de negócios complexa, métodos adicionais, ou mutabilidade, uma classe tradicional pode ser mais apropriada. Os Records são projetados para serem simples e focados – uma escolha excelente para quando a simplicidade e a imutabilidade são prioritárias.

Benefícios da Imutabilidade

Os benefícios da imutabilidade são extensivos, incluindo:

  • Segurança em ambientes concorrentes: Imutabilidade elimina race condition e erros de sincronização.
  • Garantia de integridade de dados: Uma vez que um Record é criado, seu estado não muda, o que significa que você pode confiar que os dados não serão alterados inesperadamente.
  • Código mais limpo e manutenível: Sem setters, os Records incentivam práticas de programação que produzem código mais previsível e fácil de manter.

Os Records são, portanto, um passo à frente na jornada de Java para um código mais funcional e robusto, simplificando a maneira como lidamos com dados imutáveis e aumentando a confiabilidade das aplicações Java.

Exemplos

Exemplo Básico de Record em Java: Retângulo

Primeiro, vamos começar com um exemplo simples de um Record em Java. Vamos criar um Record chamado Retangulo, que armazena a largura e a altura de um retângulo.

public record Retangulo(double largura, double altura) {
}

Este exemplo demonstra a simplicidade dos Records em Java. Aqui, Retangulo é um tipo imutável que armazena duas propriedades: largura e altura. Este é o uso mais básico de um Record para representar uma estrutura de dados.

Para instanciar este Record, você simplesmente chama o construtor com os valores desejados para largura e altura. Por exemplo:

public class Main {
    public static void main(String[] args) {
        Retangulo retangulo = new Retangulo(5.0, 3.0);

        System.out.println("Largura: " + retangulo.largura());
        System.out.println("Altura: " + retangulo.altura());
    }
}

Adicionando Validações ao Record

Agora, vamos incrementar o nosso Record Retangulo adicionando validações no construtor para garantir que a largura e a altura sejam valores positivos.

public record Retangulo(double largura, double altura) {

    public Retangulo {
        if (largura <= 0 || altura <= 0) {
            throw new IllegalArgumentException("Largura e altura devem ser maiores que zero.");
        }
    }
}

Neste exemplo, modificamos o Retangulo para incluir um construtor que valida se a largura e a altura são maiores que zero. Isso garante que o Retangulo sempre mantenha um estado válido.

Adicionando Métodos de Instância

Vamos adicionar mais funcionalidade ao nosso Retangulo incluindo métodos para calcular a área e o perímetro.

public record Retangulo(double largura, double altura) {

    public Retangulo {
        if (largura <= 0 || altura <= 0) {
            throw new IllegalArgumentException("Largura e altura devem ser maiores que zero.");
        }
    }

    public double area() {
        return largura * altura;
    }

    public double perimetro() {
        return 2 * (largura + altura);
    }
}

Agora, o Retangulo não só armazena dados, mas também oferece funcionalidades úteis, como calcular sua área e perímetro. Isso demonstra como os Records podem ser enriquecidos com métodos adicionais, mantendo sua simplicidade e eficácia.

Adicionando um Método Estático

Por fim, vamos adicionar um método estático para criar um retângulo quadrado, que é um caso especial de retângulo.

public record Retangulo(double largura, double altura) {

    public Retangulo {
        if (largura <= 0 || altura <= 0) {
            throw new IllegalArgumentException("Largura e altura devem ser maiores que zero.");
        }
    }

    public double area() {
        return largura * altura;
    }

    public double perimetro() {
        return 2 * (largura + altura);
    }

    public static Retangulo quadrado(double lado) {
        return new Retangulo(lado, lado);
    }
}

Este método estático quadrado permite a criação de um Retangulo onde a largura e a altura são iguais, demonstrando como os Records podem ser flexíveis e como métodos estáticos podem ser incorporados para fornecer funcionalidades adicionais.

Entendendo as Limitações

Herança e Records

Um ponto chave é que os Records não podem ser estendidos — eles são implicitamente finais. Isso significa que você não pode ter uma classe Record que estende outra classe ou Record. Essa decisão de design apoia a imutabilidade e o contrato definido pelos campos do Record, mas também significa que você não pode usar Records se precisar de uma hierarquia de herança.

Campos Mutáveis

Outra restrição é a impossibilidade de definir campos mutáveis dentro de um Record. Todos os campos de um Record são finais e devem ser inicializados no momento da construção. Isso está alinhado com o princípio da imutabilidade, mas pode ser limitante se a sua aplicação requer estruturas de dados mutáveis.

Interfaces e Records

Os Records podem implementar interfaces, o que permite alguma forma de polimorfismo. No entanto, como eles não podem estender outras classes, você pode se deparar com limitações se estiver tentando adaptar Records em uma arquitetura existente que depende fortemente de herança de classes.

Conclusão

Ao longo deste artigo, exploramos a versatilidade e a eficiência dos Records em Java. Desde sua introdução, eles ofereceram uma maneira mais limpa e concisa de representar dados imutáveis, trazendo uma mudança significativa na forma como os desenvolvedores Java podem abordar a modelagem de dados. Através de exemplos práticos, vimos como os Records podem ser usados para criar estruturas de dados simples e eficazes, com a vantagem adicional de validações e métodos customizados.

Agora, queremos ouvir de você! Encorajamos você a experimentar os Records em seus próprios projetos Java. Veja como eles podem simplificar sua abordagem de modelagem de dados e trazer eficiência ao seu código. Se você já está usando Records, compartilhe suas experiências: Quais foram os benefícios? Você encontrou algum desafio? Há dicas que você gostaria de compartilhar com a comunidade?

Sua contribuição é essencial para enriquecer o conhecimento coletivo e ajudar outros desenvolvedores a explorar todo o potencial dos Records em Java.

Referências

  1. Documentação Oficial da Oracle sobre Records: Para uma visão completa e detalhada dos Records, diretamente dos criadores do Java.

  2. Java Enhancement Proposals (JEP) 359: Para entender o racional, os objetivos e os detalhes técnicos por trás da introdução dos Records no Java.

  3. Veja também as novidades do Java 21

Livros para Entrevistas

Deixe um comentário

Marcações: