首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使HashMap类型的参数不可编辑?

如何使HashMap类型的参数不可编辑?
EN

Stack Overflow用户
提问于 2013-03-21 22:45:20
回答 7查看 1.2K关注 0票数 0

抱歉,我的标题可能有误导性。

这实际上来自我最近的一次JAVA面试,面试官问我这个问题:如果我们有一个类型为HashMap的参数,我们如何确保在接受方法中,用户无法修改这个HashMap ()方法。

我说的是在面试中使用final,面试官一点也不喜欢,我在网上搜索这个话题已经有一段时间了,仍然没有任何线索。

专家能帮上忙吗?谢谢

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-03-21 22:49:54

听起来您可能来自C++背景,在这种背景下,将参数设置为const确实会阻止方法修改对象。在Java语言中,final只禁止为该变量赋值;您仍然可以调用修改对象本身的方法。

所以,举个例子:

代码语言:javascript
复制
void callingMethod() {
   HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
   map.put(1, 2);

   badMethod(map);

   // NullPointerException
   System.out.println(map.get(1).intValue());
}

void badMethod(final HashMap<Integer, Integer> map) {
   map.clear();
}

有几种方法可以防止这种情况:

  1. 在调用方法之前创建defensive copy
  2. 使用Collections
  3. Use将对象包装在一个不可修改的包装器中一个显式不可变的类型,如Guava

提供的类型

票数 1
EN

Stack Overflow用户

发布于 2013-03-21 22:58:26

使用final不会阻止调用引用上的方法。它只会使引用本身不可更改。所以你的答案是错的。

我的建议是使用泛型(只在这样的面试中使用,不在节目中使用!):

代码语言:javascript
复制
    Map<String, String> map = new HashMap< String, String >();
    map.put("a", "b"); // OK

    Map< ? extends String, ? extends String > mapRO = new HashMap< String, String >();
    mapRO.put("a", "b"); // Compile error
    String value = mapRO.get("a"); // OK

正如您所看到的,使用? extends ...隐藏泛型类型可以防止“编写”方法(如put)被调用,因为它们通常需要完全定义类型。但您仍然可以调用clear(),因此它相当于池安全概念。

你也可以使用一些包装器,这会在所有的“写”方法调用中抛出异常。

票数 1
EN

Stack Overflow用户

发布于 2013-03-21 22:47:10

如何从哈希表创建一个不可修改的集合,比如here?

然后你就可以这样做了:yourMethod(Collections.unmodifiableMap(yourHashmap)); Using final only意味着你不能用这个块中的另一个引用来重写这个引用的,它不会阻止任何方法在那个对象上调用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15550679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档