我不认为有这样做的方式是有效的(如果有的话),但我想我会问,以防其他人知道.我正在寻找创建自己的缓存/查找表.为了使它尽可能有用,我希望它能够存储通用对象.这种方法的问题在于即使你可以制作一个Collections.unmodifiableMap, immutableMap, etc
,这些实现只会阻止你改变Map本身.它们不会阻止您从地图中获取值并修改其基础值.基本上我需要的是产生某种效果HashMap
,但据我所知,这种情况并不存在.
我原本以为我只能在get方法中返回缓存中值的副本,但是由于Java的Cloneable
界面被搞砸了,你不能简单地调用
public V getItem(K key){ return (V) map.get(k).clone(); }
Bohemian.. 5
你的想法很好,而且你没有内置的处理不变性的方法.
但是,你可以试试这个:
interface Copyable{ T getCopy(); }
然后重写get()
方法以返回副本而不是值本身;
class CopyMap> extends HashMap { @Override public V get(Object key) { return super.get(key).getCopy(); } }
然后由实现来返回自身的副本,而不是this
(除非类本身是不可变的).虽然你不能在代码中强制执行,但你有权公开羞辱那些不符合的程序员.
你的想法很好,而且你没有内置的处理不变性的方法.
但是,你可以试试这个:
interface Copyable<T> { T getCopy(); }
然后重写get()
方法以返回副本而不是值本身;
class CopyMap<K, V extends Copyable<V>> extends HashMap<K, V> { @Override public V get(Object key) { return super.get(key).getCopy(); } }
然后由实现来返回自身的副本,而不是this
(除非类本身是不可变的).虽然你不能在代码中强制执行,但你有权公开羞辱那些不符合的程序员.