Hashtable statique avec clé-callback lisant une variable locale thread
Question
Le problème est que j’ai une ancienne bibliothèque de services Web qui contient une table de hachage d’options globales qu’elle combine avec des options de table de hachage d’objets. Je ne peux pas influencer le code de requête, mais je peux définir la table de hachage globale. Et j’étais juste curieux de savoir s’il existe un moyen simple d’implémenter une extension de la classe Hashtable qui effectuera un callback pour que la clé lise une variable locale au thread au lieu de sa valeur originale?
MODIFIER : j'ai oublié de mentionner que je suis lié à JDK 1.4.2.
La solution
Vous pouvez créer une nouvelle classe dérivée de Hashtable
et remplacer la méthode get ()
.
Construire sur le code de twolfe18:
public class MyHashMap<K, V> extends HashMap<K, V> {
TheadLocal special = new TheadLocal ();
public MyHashMap<K, V>() {
super();
}
public V get(K key) {
if ("special".equals (key))
return special.get ();
return super.get(key);
}
}
Pour définir la valeur, utilisez map.special.set (valeur)
. La valeur sera différente par thread.
Autres conseils
le formatage est sorti terriblement dans un commentaire sur la réponse d’Aaron alors le voici:
public class MyHashMap<K, V> extends HashMap<K, V> {
public MyHashMap<K, V>() {
super();
}
public V get(K key) {
// check the key or whatever you need to do
V value = super.get(key);
// check the value or whatever you need to do
return value;
}
}
Voici le code que j'ai utilisé éventuellement:
package util;
import java.util.Hashtable;
public class SingleThreadLocalHashtable extends Hashtable {
/** Class version. */
private static final long serialVersionUID = 1L;
private ThreadLocal holder = new ThreadLocal();
private String specialKey;
public SingleThreadLocalHashtable(String specialKey) {
super();
this.holder.set(null);
this.specialKey = specialKey;
}
public synchronized Object get(Object key) {
if ((specialKey != null) && specialKey.equals(key)) {
return holder.get();
}
return super.get(key);
}
public synchronized Object put(Object key, Object value) {
if ((specialKey != null) && specialKey.equals(key)) {
holder.set(value);
}
return super.put(key, value);
}
}