Hashtable estático con variable local de subproceso de lectura de devolución de llamada

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

  •  10-07-2019
  •  | 
  •  

Pregunta

El problema es que tengo una antigua biblioteca de servicios web que tiene una tabla hash de opciones globales que combina con una tabla hash de opciones de solicitud. No puedo influir en el código de solicitud, pero puedo configurar la tabla hash global. ¿Y tenía curiosidad por saber si hay una manera simple de implementar una extensión a la clase Hashtable que realice una devolución de llamada para que parte de la clave lea alguna variable local de hilo en lugar de su valor original?

EDITAR : Olvidé mencionar que estoy obligado a JDK 1.4.2.

¿Fue útil?

Solución

Puede crear una nueva clase que se derive de Hashtable y anular el método get () .

Basándose en el código de 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);
  }
}

Para establecer el valor, use map.special.set (value) . El valor será diferente por hilo.

Otros consejos

el formato salió terrible en un comentario sobre la respuesta de Aaron, así que aquí está:

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

}

Aquí está el código que usé eventualmente:

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

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top