Frage

Das Problem ist, dass ich eine alte Web-Service-Bibliothek habe, die eine Hash-Tabelle von globalen Optionen haben, die es mit Hash-Tabelle von Anforderungsoptionen kombiniert. Ich cann't Anforderungs-Code beeinflussen, aber ich kann die globale Hash-Tabelle gesetzt. Und ich war nur neugierig, ob es eine einfache Möglichkeit ist eine Erweiterung zu Hashtable-Klasse zu implementieren, die einen Rückruf für einige der wichtigsten führen wird einige lokale Thread-Variable anstelle des ursprünglichen Wertes zu lesen?

Bearbeiten . Ich vergaß zu erwähnen, dass ich zu JDK 1.4.2 gebunden bin

War es hilfreich?

Lösung

Sie können eine neue Klasse erstellen, die von Hashtable ableitet und die get() Methode außer Kraft setzen.

Aufbauend auf dem Code von 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);
  }
}

Um den Wert zu setzen, verwenden Sie map.special.set(value). Der Wert wird pro Thread unterschiedlich sein.

Andere Tipps

kam die Formatierung aus schrecklich in einem Kommentar zu Aaron Antwort so ist es hier:

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

}

Hier ist der Code habe ich schließlich:

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top