Inicialização estática pela JVM

8

idioma: java
versão: 12.0.2
Código-fonte da string da seguinte maneira:

 /* @implNote
 * The actual value for this field is injected by JVM. The static
 * initialization block is used to set the value here to communicate
 * that this static final field is not statically foldable, and to
 * avoid any possible circular dependency during vm initialization.
 */
static final boolean COMPACT_STRINGS;

static {
    COMPACT_STRINGS = true;
}

Como entender esta frase: 'O bloco de inicialização estática é usado para definir o valor aqui para comunicar que esse campo final estático não é estaticamente dobrável e para evitar qualquer dependência circular possível durante a inicialização da vm.'

Xiu
fonte
Boa pergunta! Isso pode ser um começo: en.wikipedia.org/wiki/Constant_folding Mas não tenho idéia sobre "dependência circular durante a inicialização do vm".
Alex 75
@ Alex 75 Na minha ideia, se eles tivessem escrito assim: 'estático final booleano COMPACT_STRINGS = true'. Ainda é possível evitar qualquer dependência circular possível, porque 'COMPACT_STRINGS' recebeu um valor determinado. Mas não podia evitar estaticamente dobrável.
Xiu

Respostas:

7

É uma nota de implementação para implementadores de JVM. Não faz parte da documentação pública nem preocupa os desenvolvedores que o usam java.lang.String.

Mas se você quiser saber:

Imagine que eles escreveram:

static final boolean COMPACT_STRINGS = true;

Então seria uma constante que o compilador pudesse substituí-lo pelo valor trueonde quer que COMPACT_STRINGSfosse usado (apenas no java.langpacote, porque é uma variável de escopo local do pacote)

Ao atribuir o valor a trueum inicializador estático, o compilador não sabe mais que é uma constante e todo o código que o utiliza precisa procurar o valor real que ele tem no tempo de execução.

Nesse caso, isso é útil, porque a JVM altera esse valor no tempo de execução (mesmo que seja final, a JVM ainda pode alterá-lo), conforme mencionado na nota de implementação.

Erwin Bolwidt
fonte
você pode explicar a parte even though it's final, the JVM can still change itsobre por que a JVM pode mudar isso? Fiquei confuso sobre como a JVM consegue alterar variáveis ​​constantes.
Francis faz a pergunta
1
@Francisaskquestion É a JVM que a torna final e pode violar as regras que define para a aplicação.
user207421
@ user207421 ahh então com algum conhecimento em JVM, ele também pode alterar outras variáveis?
Francis faz a pergunta
1
A JVM pode fazer isso. Pode haver truques usando reflexão e / ou acesso inseguro que funcionam nas JVM atuais que permitem que um aplicativo faça isso, mas eles podem (e provavelmente considerando a direção da Oracle) não funcionar mais em versões futuras da JVM.
Erwin Bolwidt 8/10/19
1
@Francisaskquestion A JVM pode fazer o que quiser.
user207421