Olá Eduardo.
Tudo bem?
Ótima pergunta.
Na verdade, o Gson não precisa que a classe seja static para conseguir realizar a desserialização nesse exemplo.
O que acontece é que o Gson utiliza reflexão (Reflection API) para analisar a estrutura da classe Livro.
Quando ele encontra o atributo:
Editora editora
e no JSON existe:
"editora": {
"nome": "TechBooks",
"cidade": "São Paulo"
}
ele entende que o objeto associado à chave "editora" deve ser convertido para um objeto do tipo Editora.
O processo ocorre de forma recursiva:
- Gson cria um objeto
Livro. - Lê os campos
titulo e autor. - Ao encontrar o campo
editora, verifica que seu tipo é Editora. - Cria um objeto
Editora. - Preenche os campos
nome e cidade. - Associa o objeto
Editora ao objeto Livro.
Por isso a conversão acontece automaticamente.
Sobre sua pergunta referente a static, nesse código:
record Editora(String nome, String cidade) {}
record Livro(String titulo, String autor, Editora editora) {}
as duas records foram declaradas no mesmo arquivo, mas não estão aninhadas uma dentro da outra.
Elas são tipos independentes.
Seria uma classe aninhada se estivesse assim:
record Livro(String titulo, String autor, Editora editora) {
static record Editora(String nome, String cidade) {}
}
Nesse caso, Editora estaria realmente dentro de Livro e seria implicitamente static, pois records aninhadas são estáticas por padrão.
O ponto importante é que o Gson consegue desserializar qualquer objeto cuja estrutura corresponda ao JSON, independentemente de ele estar em um arquivo separado, no mesmo arquivo ou até mesmo aninhado, desde que o tipo seja acessível e possa ser instanciado.
Uma forma interessante de enxergar isso é pensar que o Gson não está olhando para o JSON e tentando "adivinhar" as classes. Ele olha para a classe Livro, encontra o campo Editora editora e usa essa informação para saber exatamente qual tipo deve criar quando encontra o objeto aninhado no JSON.
Excelente observação, pois entender esse mecanismo ajuda bastante quando você começar a trabalhar com APIs que retornam JSONs complexos contendo vários níveis de objetos aninhados.
Avise qualquer dúvida.
Bons estudos.