53 votes

Pourquoi le Double.valueof javadoc dire qu'il met en cache les valeurs, quand il ne l'est pas?

Dans OpenJDK, pour la méthode:

public static Double valueOf(double d)

La javadoc dit:

Renvoie une Double instance représentant le spécifié de la valeur de type double. Si un nouveau Double instance n'est pas nécessaire, cette méthode doit généralement être utilisés de préférence pour le constructeur Double(double), que cette méthode est susceptible d'avoir nettement mieux l'espace et le temps de la performance par la mise en cache souvent demandé valeurs.

Voici le code:

public static Double valueOf(double d) {
    return new Double(d);
}

Le cache est un mensonge! Ce qui se passe ici?

55voto

Aaron Digulla Points 143830

La méthode existe pour de nombreux types: Integer, Long, BigDecimal et les autres, et la documentation est toujours le même: dans certains cas (qui ne sont pas définies), la méthode peut retourner le même résultat.

Autant que je sache, la mise en cache n'est mise en œuvre pour les types d'entiers et retourne les instances mises en cache pour des valeurs comprises entre -128 et 127 (la plupart des valeurs communes). Pour BigDecimal, le cache travaille actuellement pour des valeurs allant de 0 à 10.

Plus tard, des versions de Java pourrait étendre ce comportement pour les autres valeurs de/plusieurs types. Donc, il est intelligent pour utiliser ce code aujourd'hui, car cela risque de rendre votre code plus rapide demain (et le code ne sera pas plus lent aujourd'hui).

Le compilateur Java, par exemple, utilise cette API lors de la génération de code pour l'autoboxing.

29voto

scravy Points 3070

Il n'y a rien de mal avec la doc API:

Cette méthode est susceptible de rendement...

C'est, d'une mise en œuvre est autorisé à faire de la mise en cache ici, ce qui n'est tout simplement pas possible avec un constructeur. Cependant, il n'est pas tenu de le faire. Mais, puisque les chances sont que vous avez une application qui effectue la mise en cache, cette méthode doit être préférée à l'aide d'un constructeur.

12voto

Deco Points 2174

À partir de Java 1.5+, la JVM/JIT garantit la mise en cache de l' Integers de -127 à 127. C'est pourquoi pour Integer il est préférable d'utiliser valueOf. Vous devez généralement utiliser valueOf - dessus en utilisant le constructeur de double parce qu'alors, l'équipe est en mesure d'optimiser votre code comme il l'entend. Par exemple, considérons la boucle suivante:

for (Object o: objectList) {
  o.setValue(Double.valueOf(0.0));
}

Dans ce cas, l'équipe peut précalculer le double objet et attribuer la même valeur à chaque itération de la boucle, alors que si vous utilisez new Double(0.0); il ne serait pas en mesure de le faire.

6voto

Bombe Points 34185

Les concepteurs de l'API n'a probablement pas envie de restreindre l'autre implémentation. Ceux-ci sont maintenant libres d'ajouter la mise en cache de l' Double classe.

2voto

Fabian Barney Points 5707

Ces valueOf() méthodes existent dans chaque type numérique dans le but de soutenir la mise en cache. En fait, pour le Double, il n'utilise pas de cache, mais pour Integer et Long.

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