创建不可变通用对象的哈希映射

Fur*_*rge 6 java generics caching

我不认为有这样做的方式是有效的(如果有的话),但我想我会问,以防其他人知道.我正在寻找创建自己的缓存/查找表.为了使它尽可能有用,我希望它能够存储通用对象.这种方法的问题在于即使你可以制作一个Collections.unmodifiableMap, immutableMap, etc,这些实现只会阻止你改变Map本身.它们不会阻止您从地图中获取值并修改其基础值.基本上我需要的是产生某种效果HashMap<K, ? extends Immutable>,但据我所知,这种情况并不存在.

我原本以为我只能在get方法中返回缓存中值的副本,但是由于Java的Cloneable界面被搞砸了,你不能简单地调用

public V getItem(K key){
    return (V) map.get(k).clone();
}
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 5

你的想法很好,而且你没有内置的处理不变性的方法.

但是,你可以试试这个:

interface Copyable<T> {
    T getCopy();
}
Run Code Online (Sandbox Code Playgroud)

然后重写get()方法以返回副本而不是值本身;

class CopyMap<K, V extends Copyable<V>> extends HashMap<K, V> {
    @Override
    public V get(Object key) {
        return super.get(key).getCopy();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后由实现来返回自身的副本,而不是this(除非类本身是不可变的).虽然你不能在代码中强制执行,但你有权公开羞辱那些不符合的程序员.