问题是我有一个旧的Web服务库,它有一个全局选项的哈希表,它与请求选项的哈希表结合在一起。我不能影响请求代码,但我可以设置全局哈希表。我只是好奇是否有一种简单的方法来实现对Hashtable类的扩展,它将执行一些键的回调来读取一些线程局部变量而不是它的原始值?
编辑:我忘了提到我必须使用JDK 1.4.2。
答案 0 :(得分:5)
您可以创建一个派生自Hashtable
的新类,并覆盖get()
方法。
以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);
}
}
要设置值,请使用map.special.set(value)
。每个线程的值都不同。
答案 1 :(得分:3)
格式在对Aaron的回应发表评论时非常糟糕,所以这里是:
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;
}
}
答案 2 :(得分:0)
这是我最终使用的代码:
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);
}
}