Java 带键回调的静态哈希表读取线程局部变量
问题是我有一个旧的web服务库,它有一个全局选项的哈希表,它与请求选项的哈希表相结合。我不能影响请求代码,但我可以设置全局哈希表。我只是好奇,是否有一种简单的方法来实现Hashtable类的扩展,它将对一些键执行回调,以读取一些线程局部变量,而不是它的原始值Java 带键回调的静态哈希表读取线程局部变量,java,hashtable,Java,Hashtable,问题是我有一个旧的web服务库,它有一个全局选项的哈希表,它与请求选项的哈希表相结合。我不能影响请求代码,但我可以设置全局哈希表。我只是好奇,是否有一种简单的方法来实现Hashtable类的扩展,它将对一些键执行回调,以读取一些线程局部变量,而不是它的原始值 EDIT:我忘了提到我绑定到JDK 1.4.2。您可以创建一个从哈希表派生的新类,并重写get()方法 基于twolfe18的代码: public class MyHashMap<K, V> extends HashMap<
EDIT:我忘了提到我绑定到JDK 1.4.2。您可以创建一个从
哈希表派生的新类,并重写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);
}
}
公共类MyHashMap扩展了HashMap{
TheadLocal special=新的TheadLocal();
公共MyHashMap(){
超级();
}
公共V get(K键){
如果(“特殊”。等于(键))
返回special.get();
返回super.get(key);
}
}
要设置值,请使用map.special.set(value)
。每个线程的值都会不同。在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;
}
}
公共类MyHashMap扩展了HashMap{
公共MyHashMap(){
超级();
}
公共V get(K键){
//检查钥匙或者你需要做的任何事情
V值=super.get(键);
//检查值或您需要执行的任何操作
返回值;
}
}
以下是我最终使用的代码:
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);
}
}
这是显而易见的,但它会是什么样子呢?这个想法行得通吗?是的,应该行得通。关于实现,请看我的答案(但我不是故意偷猎,这要归功于Aaron)。您可以更改Hashtable对象还是仅更改其内容?是的,我可以更改Hashtable对象。