Domanda

Il problema è che ho una vecchia libreria di servizi web che ha una hashtable di opzioni globali che combina con hashtable di opzioni di richiesta. Non posso influenzare il codice di richiesta, ma posso impostare la tabella hash globale. Ed ero solo curioso di sapere se esiste un modo semplice per implementare un'estensione alla classe Hashtable che eseguirà un callback per una parte della chiave per leggere una variabile thread-local invece del suo valore originale?

MODIFICA : ho dimenticato di dire che sono legato a JDK 1.4.2.

È stato utile?

Soluzione

Puoi creare una nuova classe che deriva da Hashtable e sovrascrivere il metodo get () .

Basandosi sul codice di 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);
  }
}

Per impostare il valore, utilizzare map.special.set (valore) . Il valore sarà diverso per thread.

Altri suggerimenti

la formattazione è risultata terribile in un commento sulla risposta di Aaron, quindi eccola qui:

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

}

Ecco il codice che ho usato alla fine:

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top