Java最多只读一次地图

时间:2011-09-15 18:21:27

标签: java map

是否有java.util.Map的实现只允许读取一次值?我想做的是这样的事情:

Map map = new ReadOnceMap();
map.put("key", "value")
System.out.println(map.get("key")); // prints "value"
System.out.println(map.get("key")); // prints null

编辑:要求:

  • 现有实施
  • 保证最多可以读取一次

4 个答案:

答案 0 :(得分:4)

map.remove()应该为您提供所需的行为

Map map = new ReadOnceMap();
map.put("key", "value")
System.out.println(map.remove("key")); // prints "value"
System.out.println(map.remove("key")); // prints null

答案 1 :(得分:2)

这样的东西?

public class GetOnceHashMap<K,V> extends HashMap<K,V> {
    @Override
    public V get(Object key) {
        return remove(key);
    }

    @Override
    public Collection<V> values() {
        Collection<V> v = new ArrayList<V>(super.values());
        clear();
        return v;
    }

    @Override
    public Set<Map.Entry<K, V>> entrySet() {
        Set<Map.Entry<K, V>> e = new HashSet<Map.Entry<K,V>>(super.entrySet());
        clear();
        return e;
    }
}

答案 2 :(得分:2)

只需调用remove()方法而不是get()方法。 remove()方法返回从地图中删除的对象。所以,第一次你得到你的对象,之后它将返回null。

答案 3 :(得分:1)

这是我提出的一个实现。

注意:这不是真正的生产质量,因为我依靠new ArrayListnew HashSet急切地(不是懒惰地)读取这些值。为了提高这种生产质量,我将摆脱继承并使用动态代理或对象组合。

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ReadOnceMap<K, V> extends HashMap<K, V> {

    @Override
    public V get(Object key) {
        return remove(key);
    }

    @Override
    public Set<Map.Entry<K, V>> entrySet() {
        Set<Map.Entry<K, V>> entrySet = new HashSet<Map.Entry<K, V>>(super.entrySet());
        clear();
        return entrySet;
    }

    @Override
    public Collection<V> values() {
        Collection<V> values = new ArrayList<V>(super.values());
        clear();
        return values;
    }
}