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.

Était-ce utile?

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);
    }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top