Dúvida sobre bloco de código static

Olá amigos, esses dias estudando um pouco de design patterns vi esse trecho de código abaixo em um exemplo de Prototype.
A minha dúvida é sobre esse bloco de static sendo usado dessa forma, é algo que até então nos estudos de java não tinha visto ainda.
E confesso que fiquei meio perdido nesse sentido, quanto a escopo, funcionamento, motivação de uso.
Se alguém puder dar uma luz de entendimento ou algum link com explicação sobre, desde já eu agradeço!

Segue o link do código no meu github:
link do código no github


final class DocumentosRegistry2 {

    private static final DocumentosRegistry2 INSTANCE = new DocumentosRegistry2();

    private static final Map<String, Documento2> REGISTRY = new HashMap<>();

    static {
        Documento2 d1 = new Documento2();
        d1.tipo = "PDF";
        d1.visibilidade = "RESTRITO";
        REGISTRY.put("PDF RESTRITO", d1);

        Documento2 d2 = new Documento2();
        d2.tipo = "PDF";
        d2.visibilidade = "PUBLICO";
        REGISTRY.put("PDF PUBLICO", d2);

        Documento2 d3 = new Documento2();
        d3.tipo = "DOC";
        d3.visibilidade = "RESTRITO";
        REGISTRY.put("DOC RESTRITO", d3);

        Documento2 d4 = new Documento2();
        d4.tipo = "DOC";
        d4.visibilidade = "PUBLICO";
        REGISTRY.put("DOC PUBLICO ", d4);
    }

    public static DocumentosRegistry2 getInstance() {
        return INSTANCE;
    }

    public Documento2 getDocumento2(String chave) {
        try {
            return REGISTRY.get(chave).clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

Um bloco static é executado apenas uma vez, quando a classe é carregada pela JVM. Se tiver mais de um, eles são executados na ordem em que aparecem.

No caso, o bloco está adicionando elementos no map REGISTRY. Assim, na primeira vez que ele for usado, ja estará com os dados necessários.

A motivação é justamente essa: garantir que campos estáticos sejam inicializados antes de serem usados.

2 curtidas

Já foi solucionado e muito bem explicado pelo hugokotsubo, mas só complementando:
Usando o static essas variáveis são compartilhadas com todos os objetos, se vc tiver 5 instâncias de DocumentosRegistry2 e alterar a variável d1 em um desses, irá alterar para todas as outras instâncias. O que não aconteceria se esse bloco static estivesse dentro de um construtor.

Documento2 d1;
Documento2 d2;
...
public DocumentosRegistry2() {
        d1 = new Documento2();
        d1.tipo = "PDF";
        d1.visibilidade = "RESTRITO";
        REGISTRY.put("PDF RESTRITO", d1);

        d2 = new Documento2();
        d2.tipo = "PDF";
        d2.visibilidade = "PUBLICO";
        REGISTRY.put("PDF PUBLICO", d2);

       ...
}
1 curtida