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'.
Respuestas:
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:
Entonces habría sido una constante que el compilador podría reemplazarlo con el valor
true
dondeCOMPACT_STRINGS
se usó (solo en eljava.lang
paquete, porque es una variable de ámbito local del paquete)Al darle el valor
true
en 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.fuente
even though it's final, the JVM can still change it
por qué JVM puede cambiarlo? Tengo confusión sobre cómo JVM logra cambiar las variables constantes.