0Pricing
Java Academy · Aula

Padrões de registros aninhados

Faça correspondência com dados profundamente aninhados.

Padrões de registros aninhados é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.

Padrões de registro aninhados

Os padrões de registro podem ser aninhados: um componente que também é um registro pode ser desestruturado dentro do padrão externo. Isso permite corresponder a dados profundamente estruturados em uma única expressão.

Um modelo de dados aninhado

Considere uma Line composta por dois registros Point. Os registros internos são candidatos naturais ao aninhamento.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Line line = new Line(new Point(0, 0), new Point(3, 4));
        System.out.println(line);
    }
}

Desestruturação de um nível

Um padrão simples vincula os dois componentes Point, mas os mantém inteiros.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Object obj = new Line(new Point(0, 0), new Point(3, 4));
        if (obj instanceof Line(Point s, Point e)) {
            System.out.println(s + " -> " + e);
        }
    }
}

Indo mais fundo

Substitua os Point s internos pelos próprios padrões de registro para alcançar as coordenadas diretamente: Line(Point(int x1, int y1), Point(int x2, int y2)).

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Object obj = new Line(new Point(0, 0), new Point(3, 4));
        if (obj instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            double len = Math.hypot(x2 - x1, y2 - y1);
            System.out.println("Length: " + len);
        }
    }
}

Qualquer profundidade

O aninhamento pode alcançar a profundidade dos seus dados. Cada nível vincula um componente inteiro ou o desestrutura ainda mais, reproduzindo exatamente a forma da estrutura.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}
    record Drawing(Line first, String label) {}

    public static void main(String[] args) {
        Object obj = new Drawing(new Line(new Point(1, 2), new Point(3, 4)), "diag");
        if (obj instanceof Drawing(Line(Point(var ax, var ay), var end), var label)) {
            System.out.println(label + " starts at " + ax + "," + ay);
            System.out.println("ends near " + end);
        }
    }
}

Misturando inferência de tipo e tipos explícitos

Dentro de um padrão aninhado, você pode misturar livremente tipos explícitos e var. Use var para componentes que serão apenas repassados e tipos explícitos onde a clareza for importante.

Aninhamento na seleção

Os padrões aninhados são especialmente expressivos em seleções, permitindo que cada caso descreva uma forma precisa dos dados.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static String describe(Object o) {
        return switch (o) {
            case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
            case Line(Point p1, Point p2) -> "general line";
            default -> "not a line";
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(new Line(new Point(2, 0), new Point(2, 9))));
        System.out.println(describe(new Line(new Point(0, 0), new Point(5, 5))));
    }
}

Toda a correspondência deve ser válida

Um padrão aninhado só corresponde se todos os níveis corresponderem. Se algum componente tiver um tipo diferente daquele esperado pelo seu subpadrão, a correspondência geral falhará e nenhuma variável será vinculada.

Compromisso com a legibilidade

O aninhamento profundo é poderoso, mas pode ficar difícil de ler. Se um padrão crescer demais, considere desestruturar um nível e tratar o restante com uma lógica separada.

Guardas sobre vinculações aninhadas

Como os padrões aninhados expõem os valores internos como variáveis locais, uma única guarda when pode fazer referência a campos de vários níveis ao mesmo tempo.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static boolean isUnitStep(Object o) {
        return o instanceof Line(Point(int x1, int y1), Point(int x2, int y2))
            && x2 - x1 == 1 && y2 - y1 == 1;
    }

    public static void main(String[] args) {
        System.out.println(isUnitStep(new Line(new Point(0, 0), new Point(1, 1))));
        System.out.println(isUnitStep(new Line(new Point(0, 0), new Point(2, 2))));
    }
}

Um exemplo completo

Calcule o ponto médio de uma linha desestruturando suas duas extremidades.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static Point midpoint(Object o) {
        if (o instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            return new Point((x1 + x2) / 2, (y1 + y2) / 2);
        }
        return null;
    }

    public static void main(String[] args) {
        System.out.println(midpoint(new Line(new Point(0, 0), new Point(4, 6))));
    }
}

Verificação rápida

Teste sua compreensão dos padrões de registro aninhados.

Recapitulação

Você aprendeu os padrões de registro aninhados.

  • Um componente de registro que também é um registro pode ser desestruturado diretamente no padrão.
  • O aninhamento pode alcançar qualquer profundidade e misturar tipos explícitos com var.
  • A correspondência só é bem-sucedida se todos os níveis corresponderem.
  • As vinculações internas podem ser usadas nas guardas e no corpo.

Perguntas Frequentes

A aula “Padrões de registros aninhados” é grátis?

Sim — o texto completo de “Padrões de registros aninhados” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.

O que vou aprender em “Padrões de registros aninhados”?

Faça correspondência com dados profundamente aninhados. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Padrões de registros aninhados”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Correspondência de padrões para instanceof
  2. Padrões de registros
  3. Padrões de registros aninhados
  4. Padrões em switch
← Voltar para Java Academy