スレッドローカル変数を読み取るキーコールバックを備えた静的ハッシュテーブル
質問
問題は、リクエストオプションのハッシュテーブルと結合するグローバルオプションのハッシュテーブルを持つ古い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);
}
}
所属していません StackOverflow