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

 天之苍 发布于 2023-02-08 11:53

我不认为有这样做的方式是有效的(如果有的话),但我想我会问,以防其他人知道.我正在寻找创建自己的缓存/查找表.为了使它尽可能有用,我希望它能够存储通用对象.这种方法的问题在于即使你可以制作一个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(除非类本身是不可变的).虽然你不能在代码中强制执行,但你有权公开羞辱那些不符合的程序员.

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

    但是,你可以试试这个:

    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(除非类本身是不可变的).虽然你不能在代码中强制执行,但你有权公开羞辱那些不符合的程序员.

    2023-02-08 11:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有