抱歉,我的标题可能有误导性。
这实际上来自我最近的一次JAVA面试,面试官问我这个问题:如果我们有一个类型为HashMap的参数,我们如何确保在接受方法中,用户无法修改这个HashMap ()方法。
我说的是在面试中使用final,面试官一点也不喜欢,我在网上搜索这个话题已经有一段时间了,仍然没有任何线索。
专家能帮上忙吗?谢谢
发布于 2013-03-21 22:49:54
听起来您可能来自C++背景,在这种背景下,将参数设置为const确实会阻止方法修改对象。在Java语言中,final只禁止为该变量赋值;您仍然可以调用修改对象本身的方法。
所以,举个例子:
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();
}有几种方法可以防止这种情况:
提供的类型
发布于 2013-03-21 22:58:26
使用final不会阻止调用引用上的方法。它只会使引用本身不可更改。所以你的答案是错的。
我的建议是使用泛型(只在这样的面试中使用,不在节目中使用!):
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(),因此它相当于池安全概念。
你也可以使用一些包装器,这会在所有的“写”方法调用中抛出异常。
发布于 2013-03-21 22:47:10
如何从哈希表创建一个不可修改的集合,比如here?
然后你就可以这样做了:yourMethod(Collections.unmodifiableMap(yourHashmap)); Using final only意味着你不能用这个块中的另一个引用来重写这个引用的,它不会阻止任何方法在那个对象上调用。
https://stackoverflow.com/questions/15550679
复制相似问题