是否可以将HashMap的某些特定键设为只读?

时间:2014-07-04 12:28:39

标签: java hashmap

我有5个密钥,不得删除/更新。我提供了自己的方法来添加,获取和删除此HashMap的密钥。

UnmodifiableMap会将所有密钥设为只读,因此我也无法使用它。我可以维护List这些只读密钥,每当调用add / remove方法时,我都可以引用此List并阻止该操作。但还有其他更好的方法来实现这一目标吗?

提前致谢!

编辑:我知道我可以扩展HashMap并覆盖put方法。这与我在上面的问题描述中所说的相似(维护List只读密钥并阻止对它们进行操作。我认为有可能在UnmodifiableMap中合并HashMap,以便来自UnmodifiableMap的密钥在新HashMap中保持只读,其他密钥将支持所有操作。

2 个答案:

答案 0 :(得分:6)

Andre所述,您可以继承HashMap或其他Map实施。

这是一个匿名类快速示例,在main方法中自包含:

public static void main(String[] args) {
    Map<String, String> myMap = new HashMap<String, String>() {

        private static final long serialVersionUID = 6585814488311720276L;
        @Override
        public String put(String key, String value) {
            if (key != null && !key.equalsIgnoreCase("foo")) {
                return super.put(key, value);
            }
            else {
                throw new IllegalArgumentException("No foo's allowed!");
            }
        }
        // TODO!
        @Override
        public void putAll(Map<? extends String, ? extends String> m) {
            // TODO Auto-generated method stub
            super.putAll(m);
        }
    };
    System.out.println(myMap.put("blah", "blah"));
    System.out.println(myMap.put("foo", "blah"));
}

<强>输出

null
Exception in thread "main" java.lang.IllegalArgumentException: No foo's allowed!
    at test.Main$1.put(Main.java:18)
    at test.Main$1.put(Main.java:1)
    at test.Main.main(Main.java:29)

答案 1 :(得分:0)

创建一个Map,它将封装另外两张地图。其中一张地图将是一张不可修改的地图,其中包含您的只读密钥,另一张将是常规HashMap

当您获得密钥时,请查看两个地图,从不可修改的地图开始。放置后,在检查第一张地图中是否已存在该键后,仅使用第二张地图。