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.
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.
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.
eh Bien, c'est une classe abstraite. J'ai trouvé un copier. Avoir un coup d'oeil.
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;
}
};