Estática Hashtable com a leitura de chave-callback variável de segmento local

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

  •  10-07-2019
  •  | 
  •  

Pergunta

O problema é que eu tenho uma biblioteca de serviço web de idade, que tem uma tabela hash de opções globais que se combina com hashtable de opções de solicitação. Eu cann't influenciar código de pedido, mas eu posso definir o hashtable global. E eu estava apenas curioso se existe uma maneira simples de implementar uma extensão para a classe Hashtable que irá realizar uma chamada de retorno para alguns a chave para ler alguns variável de segmento local, em vez de seu valor original?

Editar :. Eu esqueci de mencionar que eu sou obrigado a JDK 1.4.2

Foi útil?

Solução

Você pode criar uma nova classe que deriva de Hashtable e substituir o método get().

Com base no 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 definir o valor, map.special.set(value) uso. O valor será diferente por thread.

Outras dicas

a formatação saiu terrível em um comentário sobre a resposta de Aaron por isso aqui 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;
  }

}

Aqui está o código que usei finalmente:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top