ClassValue en Java 7

en parcourant la documentation de L'API Java 7, je suis tombé sur la nouvelle classe java.lang.ClassValue, avec assez minimes de la documentation:

associe paresse une valeur calculée avec (potentiellement) chaque type. Par exemple, si un langage dynamique a besoin de construire une table de répartition de message pour chaque classe rencontrée à un site d'appel d'envoi de message, il peut utiliser un ClassValue pour mettre en cache les informations nécessaires pour effectuer le message envoyer rapidement, pour chaque classe rencontrés.

est-ce que quelqu'un peut donner une meilleure explication de quel problème cette classe résout et peut-être un exemple de code ou de projet open source qui utilise déjà cette classe?

mise à Jour: je suis toujours intéressé par du code source réel ou des exemples utilisant cette nouvelle classe.

j'ai aussi trouvé ce mail sur la liste de diffusion mlvm-dev concernant certaines améliorations de mise en oeuvre. Il a été apparemment changé de l'utilisation d'un WeakHashMap vers un nouveau champ privé sur java.lang.Classe pour le rendre plus évolutif.

34
demandé sur skaffman 2011-09-16 16:07:14

4 réponses

la meilleure explication du but de cette classe est qu'elle résout Java Bug 6389107

il existe de nombreux cas d'utilisation où l'on veut essentiellement avoir un Map<Class<?>, T> pour une raison quelconque, mais ce qui provoque toutes sortes d'ennuis depuis Class les objets ne seront pas alors GC-able jusqu'à ce que la carte soit. WeakHashMap<Class<?>, T> ne résout pas le problème, car très souvent, T fait référence à la classe.

le bug ci-dessus va dans une explication beaucoup plus détaillée et contient exemples de projets / codes qui font face à ce problème.

ClassValue est la réponse à ce problème. Un chargement/déchargement sûr et sécurisé pour associer des données à une classe.

10
répondu Scott Carey 2015-02-13 13:23:12

son but est de permettre l'ajout d'informations d'exécution à des classes cibles arbitraires (référence).

je pense qu'il est plus ciblé sur les programmeurs de langage dynamique. Je ne suis pas sûr comment il sera utile pour les développeurs d'applications générales si.

initialement la classe était là dans le paquet java.dyn. ce bug affiche le déplacement de java.lang.

6
répondu Suraj Chandran 2011-09-16 16:11:16

eh Bien, c'est une classe abstraite. J'ai trouvé un copier. Avoir un coup d'oeil.

1
répondu Mister Smith 2011-09-16 12:26:52

classvalue cache quelque chose à propos de la classe. voici une partie du code (à lucene 5.0 AttributeSource.java)

/** a cache that stores all interfaces for known implementation classes for performance (slow reflection) */
  private static final ClassValue<Class<? extends Attribute>[]> implInterfaces = new ClassValue<Class<? extends Attribute>[]>() {
@Override
protected Class<? extends Attribute>[] computeValue(Class<?> clazz) {
  final Set<Class<? extends Attribute>> intfSet = new LinkedHashSet<>();
  // find all interfaces that this attribute instance implements
  // and that extend the Attribute interface
  do {
    for (Class<?> curInterface : clazz.getInterfaces()) {
      if (curInterface != Attribute.class && Attribute.class.isAssignableFrom(curInterface)) {
        intfSet.add(curInterface.asSubclass(Attribute.class));
      }
    }
    clazz = clazz.getSuperclass();
  } while (clazz != null);
  @SuppressWarnings({"unchecked", "rawtypes"}) final Class<? extends Attribute>[] a =
      intfSet.toArray(new Class[intfSet.size()]);
  return a;
}
};
1
répondu user5630205 2016-07-04 09:42:08