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.'
Respostas:
É 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:
Então seria uma constante que o compilador pudesse substituí-lo pelo valor
true
onde quer queCOMPACT_STRINGS
fosse usado (apenas nojava.lang
pacote, porque é uma variável de escopo local do pacote)Ao atribuir o valor a
true
um 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.fonte
even though it's final, the JVM can still change it
sobre por que a JVM pode mudar isso? Fiquei confuso sobre como a JVM consegue alterar variáveis constantes.