Статическая инициализация JVM - PullRequest
8 голосов
/ 08 октября 2019

язык: java
версия: 12.0.2
Исходный код строки следующим образом:

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

Как понять это предложение: «Блок статической инициализации используется для установки значения здесьсообщить, что это статическое конечное поле не является статически складываемым, и избежать любой возможной циклической зависимости во время инициализации vm. '

1 Ответ

7 голосов
/ 08 октября 2019

Это примечание к реализации для разработчиков JVM. Это не является частью публичной документации и не касается разработчиков, использующих java.lang.String.

Но если вы хотите знать:

Представьте, что они написали:

static final boolean COMPACT_STRINGS = true;

Тогда было бы константой, что компилятор мог бы заменить его значениемtrue везде, где COMPACT_STRINGS использовалось (только в пакете java.lang, потому что это переменная локальной области действия пакета)

Давая ему значение true в статическом инициализаторе, компилятор не 'Я больше не знаю, что это константа, и весь код, который ее использует, должен искать фактическое значение, которое он имеет во время выполнения.

В этом случае это полезно, потому что JVM изменяет это значение во время выполнения (даже если это final, JVM все еще может его изменить), как отмечается в примечании к реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...