Statische Hashtable mit Schlüssel-Callback-Lesefaden lokalen Variable
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
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);
}
}