Статическая Hashtable с локальной переменной потока чтения ключа

StackOverflow https://stackoverflow.com/questions/1439603

  •  10-07-2019
  •  | 
  •  

Вопрос

Проблема в том, что у меня есть старая библиотека веб-служб, в которой есть хеш-таблица глобальных опций, которую она комбинирует с хеш-таблицей опций запроса. Я не могу повлиять на код запроса, но могу установить глобальную хеш-таблицу. И мне было просто любопытно, есть ли простой способ реализовать расширение класса 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) . Значение будет отличаться для каждого потока.

Другие советы

форматирование получилось ужасным в комментарии к ответу Аарона, так что вот оно:

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