是否有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
编辑:要求:
答案 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 ArrayList
和new 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;
}
}