スレッドローカル変数を読み取るキーコールバックを備えた静的ハッシュテーブル

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

  •  10-07-2019
  •  | 
  •  

質問

問題は、リクエストオプションのハッシュテーブルと結合するグローバルオプションのハッシュテーブルを持つ古い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)を使用します。値はスレッドごとに異なります。

他のヒント

アーロンの応答に対するコメントでフォーマットがひどいので、ここにあります:

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