Da trilha de Java Este conceito ainda não saiu como card do dia. ir para o card de hoje

Java Tipos Intermediário

Records

Em Java, um record é uma classe especial que serve como portadora de dados imutáveis. Introduzido no Java 16, ele gera automaticamente construtor, métodos de acesso (getters), equals, hashCode e toString, reduzindo muito o código repetitivo. Records são ideais para representar valores simples, como pontos, coordenadas ou resultados, e promovem a imutabilidade por padrão, pois seus campos são final e não há setters.

Pontos-chave

  • record é uma forma concisa de declarar classes imutáveis que carregam dados.
  • O compilador gera automaticamente construtor, acessores, equals, hashCode e toString.
  • Construtores compactos permitem validar ou normalizar dados sem repetir a lista de parâmetros.
  • Records são implicitamente final e seus campos são final, garantindo imutabilidade.
  • Records não podem estender outras classes, mas podem implementar interfaces.
ExemploRecord.java
// Exemplo de record em Java
public class ExemploRecord {
    // Declaração do record
    public record Ponto(int x, int y) {
        // Construtor compacto para validação
        public Ponto {
            if (x < 0 || y < 0) {
                throw new IllegalArgumentException("Coordenadas não podem ser negativas");
            }
        }
    }

    public static void main(String[] args) {
        // Criando instâncias
        Ponto p1 = new Ponto(3, 4);
        Ponto p2 = new Ponto(3, 4);
        Ponto p3 = new Ponto(5, 6);

        // Usando métodos gerados
        System.out.println(p1); // Ponto[x=3, y=4]
        System.out.println("x de p1: " + p1.x());
        System.out.println("p1 equals p2? " + p1.equals(p2)); // true
        System.out.println("p1 equals p3? " + p1.equals(p3)); // false

        // Tentando criar com valores inválidos
        try {
            new Ponto(-1, 2);
        } catch (IllegalArgumentException e) {
            System.out.println("Erro: " + e.getMessage());
        }
    }
}

Exercícios

  1. 1
    Fácil

    Criando um record para representar uma pessoa

    Crie um record chamado Pessoa que armazene nome (String) e idade (int). No método main, crie duas instâncias, imprima seus toString, e compare-as com equals.

    Resolver
  2. 2
    Médio

    Record com validação usando construtor compacto

    Crie um record Produto com nome (String) e preco (double). Use um construtor compacto para garantir que o preço seja maior que zero. No main, tente criar um produto com preço inválido e capture a exceção, imprimindo uma mensagem.

    Resolver
  3. 3
    Desafio

    Record vs Classe: comparando imutabilidade e igualdade

    Implemente duas versões de uma entidade Coordenada: uma como record e outra como classe tradicional. Ambas devem ter x e y (int), com validação que rejeita valores negativos. No main, crie instâncias de ambas, compare-as com equals e imprima os resultados. Mostre que o record é imutável (tentativa de modificação gera erro de compilação) e que a classe pode ser mutável se fornecer setters.

    Resolver

Continue estudando