Inicialización estática por JVM

8

idioma:
versión de Java : 12.0.2
Código fuente de cadena de la siguiente manera:

 /* @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;
}

Cómo entender esta oración: 'El bloque de inicialización estática se usa para establecer el valor aquí para comunicar que este campo final estático no es estáticamente plegable y para evitar cualquier posible dependencia circular durante la inicialización de vm'.

Xiu
fuente
¡Buena pregunta! Esto puede ser un comienzo: en.wikipedia.org/wiki/Constant_folding Pero no tengo idea acerca de la "dependencia circular durante la inicialización de VM".
Alex 75
@Alex 75 En mi idea, si hubieran escrito así: 'static boolean final COMPACT_STRINGS = true'. Todavía puede evitar cualquier posible dependencia circular, porque 'COMPACT_STRINGS' ha recibido un valor determinado. Pero no pudo evitar estáticamente plegable.
Xiu el

Respuestas:

7

Es una nota de implementación para implementadores de JVM. No forma parte de la documentación pública ni preocupa a los desarrolladores que lo utilizan java.lang.String.

Pero si quieres saber:

Imagina que hubieran escrito:

static final boolean COMPACT_STRINGS = true;

Entonces habría sido una constante que el compilador podría reemplazarlo con el valor truedonde COMPACT_STRINGSse usó (solo en el java.langpaquete, porque es una variable de ámbito local del paquete)

Al darle el valor trueen un inicializador estático, el compilador ya no sabe que es una constante y todo el código que lo usa tiene que buscar el valor real que tiene en tiempo de ejecución.

En este caso, eso es útil, porque la JVM cambia este valor en tiempo de ejecución (aunque lo sea final, la JVM aún puede cambiarlo), como menciona la nota de implementación.

Erwin Bolwidt
fuente
¿Puedes explicar la parte de even though it's final, the JVM can still change itpor qué JVM puede cambiarlo? Tengo confusión sobre cómo JVM logra cambiar las variables constantes.
Francis hace una pregunta el
1
@Francisaskquestion Es la JVM la que lo hace definitivo, y puede romper las reglas que establece para la aplicación.
user207421
@ user207421 ahh, entonces con algunos conocimientos sobre JVM, ¿también puede alterar otras variables?
Francis hace una pregunta el
1
La JVM puede hacerlo. Puede haber trucos que utilicen la reflexión y / o el acceso inseguro que funcionan en las JVM actuales que permiten que una aplicación lo haga, pero estos (y probablemente considerarán la dirección de Oracle) ya no funcionarán en futuras versiones de la JVM.
Erwin Bolwidt
1
@Francisaskquestion La JVM puede hacer lo que quiera.
user207421