51 votes

Pourquoi parseInt met-il en garde l'utilisation de valueOf?

Lorsque l'on regarde le code source de Integer.parseInt(String s, int radix) (java 8, 1.8.0_131), j'ai trouvé le commentaire suivant du bloc:

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

Bien que je comprenne la première partie sur la IntegerCache, je ne comprends pas pourquoi il y a un avertissement sur l' valueOf, et pourquoi dans ce contexte.

Je vois qu' valueOf() s'appuie sur parseInt(), mais je ne comprends toujours pas pourquoi il y a cet avertissement.

Quelqu'un peut m'expliquer ce qu'est exactement le commentaire me prévient (et le contexte où valueOf ne doit pas être utilisée), et de ce qui pourrait aller mal.

Edit:

Le code en Entier.valueOf(int i) semble avoir changé depuis l'autre question dans le commentaire ci-dessous a été demandé, il est maintenant

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

et doit être enregistrer à partir de l'affirmation d'erreur avant.

55voto

John Bollinger Points 16563

Quelqu'un peut m'expliquer ce qu'est exactement le commentaire me prévient (et le contexte où valueOf ne doit pas être utilisée), et de ce qui pourrait aller mal.

L' Integer classe crée et maintient un cache des Integer des objets représentant des petites valeurs entières; par défaut, les valeurs dans la plage de -128 à 127 sont couverts (plus de discussion ici, ici, et beaucoup d'autres endroits). Integer.valueOf() retournera un objet à partir de ce cache lorsque son argument représente un nombre dans l'intervalle. Le commentaire est en garde que parseInt() ne doit pas compter sur valueOf() parce que la première peut être appelée avant que le cache est rempli.

La mauvaise conduite qui pourrait être prévue dans ce cas n'est pas spécifié, et, éventuellement, peuvent varier entre les versions de Java, mais plausibles, les possibilités sont que null serait retourné ou une exception (NullPointerException, IndexOutOfBoundsException,,...) pourra être levée.

En tout cas, c'est un commentaire interne dans la mise en œuvre, pas un commentaire pour les utilisateurs de la classe Integer. Par le temps de tout code d'utilisateur s'exécute, le nécessaire cache l'initialisation est terminée, et Integer.valueOf() peut être invoqué à se comporter pleinement que sa documentation de l'API décrit.

37voto

Carlos Heuberger Points 11804

Le code source est (presque) juste pour référence, le javadoc ne contient pas cet avertissement car il est uniquement destiné aux développeurs de Java lui-même.

Il s'agit probablement d'un avertissement, car il y a eu un problème ou un bogue provoqué par une personne utilisant la méthode valueOf pour coder la méthode parseInt pouvant être appelée avant l'initialisation du cache interne.

En d'autres termes, cet avertissement ne vous est pas destiné, à condition que vous ne changiez pas la classe Integer!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X