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

编辑:我忘了提到我必须使用JDK 1.4.2。

有帮助吗?

解决方案

您可以创建一个派生自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)。每个线程的值都不同。

其他提示

格式在对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;
  }

}

这是我最终使用的代码:

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

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top