Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带键回调的静态哈希表读取线程局部变量_Java_Hashtable - Fatal编程技术网

Java 带键回调的静态哈希表读取线程局部变量

Java 带键回调的静态哈希表读取线程局部变量,java,hashtable,Java,Hashtable,问题是我有一个旧的web服务库,它有一个全局选项的哈希表,它与请求选项的哈希表相结合。我不能影响请求代码,但我可以设置全局哈希表。我只是好奇,是否有一种简单的方法来实现Hashtable类的扩展,它将对一些键执行回调,以读取一些线程局部变量,而不是它的原始值 EDIT:我忘了提到我绑定到JDK 1.4.2。您可以创建一个从哈希表派生的新类,并重写get()方法 基于twolfe18的代码: public class MyHashMap<K, V> extends HashMap<

问题是我有一个旧的web服务库,它有一个全局选项的哈希表,它与请求选项的哈希表相结合。我不能影响请求代码,但我可以设置全局哈希表。我只是好奇,是否有一种简单的方法来实现Hashtable类的扩展,它将对一些键执行回调,以读取一些线程局部变量,而不是它的原始值


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对象。