Подтвердить что ты не робот

Почему parseInt предупреждает об использовании valueOf

При просмотре исходного кода для Integer.parseInt(String s, int radix) (java 8, 1.8.0_131) я нашел следующий блок комментариев:

/*
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/

Пока я понимаю первую часть IntegerCache, я не понимаю, почему существует предупреждение о valueOf и почему в этом контексте.

Я вижу, что valueOf() полагается на parseInt(), но я до сих пор не понимаю, почему это предупреждение.

Может кто-нибудь объяснить, что именно предупреждает меня комментарий (и контекст, где valueOf не должен использоваться), и что может пойти не так.

Edit:

Код в Integer.valueOf(int i), похоже, изменился с тех пор, как был задан другой вопрос из комментария ниже, теперь он

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

и должен быть сохранен ранее.

4b9b3361

Ответ 1

Может кто-нибудь объяснить, что именно предупреждает меня комментарий (и контекст, где valueOf не должен использоваться), и что может пойти не так.

Класс Integer создает и поддерживает кеш объектов Integer, представляющих небольшие целочисленные значения; по умолчанию значения в диапазоне от -128 до 127 покрываются (здесь обсуждается , здесь, и многие другие места). Integer.valueOf() возвращает объект из этого кеша, когда его аргумент представляет число в диапазоне. Комментарий предупреждает, что parseInt() не должен полагаться на valueOf(), потому что первый может быть вызван до того, как этот кеш будет заселен.

Неправильное поведение, которое можно ожидать в этом случае, не указывается и, возможно, может варьироваться между версиями Java, но правдоподобные возможности заключаются в том, что null будет возвращено или исключение (NullPointerException, IndexOutOfBoundsException,... ) было бы брошено.

В любом случае, это внутренний комментарий в реализации, а не комментарий для пользователей класса Integer. К моменту запуска любого пользовательского кода необходимая инициализация кэша завершается, и на Integer.valueOf() можно полагаться на то, чтобы полностью вести себя как в его документации по API.

Ответ 2

Исходный код (почти) только для справки, javadoc не содержит этого предупреждения, поскольку он предназначен только для разработчиков самой Java.

Это, вероятно, предупреждение, так как была некоторая проблема или ошибка, вызванная тем, кто использует метод valueOf для кодирования метода parseInt, который может быть вызван до инициализации внутреннего кэша.

Другими словами, это предупреждение не предназначено для вас, если вы не меняете класс Integer!