gpt4 book ai didi

java - 检查防御副本空值的首选方法

转载 作者:行者123 更新时间:2023-12-04 20:49:02 24 4
gpt4 key购买 nike

假设我有以下方法:

public void change(Map<String, String> map)

如果 mapnull,我想抛出一个异常,如果不是,则制作一个防御性副本。

这是首选吗:

public void change(Map<String, String> map)
{
Map<String, String> temp = null;

synchronized (map) {
if (map == null)
throw new NullPointerException("map is null");
temp = new HashMap<String, Object>(map);
}

public void change(Map<String, String> map)
try {
Map<String, String> temp = new HashMap<String, Object>(map);
}
catch (NullPointerException e) {
throw new NullPointerException("map is null");
}

或者有更好的方法吗?为什么和为什么不。

编辑:

修改了几个错别字:

properties 应该是 map

(String, Object) 应该是 (String, String)

谢谢!

最佳答案

好吧,如果 map 不是由于您的代码,而是由于 synchronized block ,所以您的第一种方法将抛出异常。

鉴于在您的第二种方法中您声明了一个本地 变量,这将毫无意义,因此您并不清楚您要尝试做什么。是想设置一个实例变量,还是在创建副本后在 map 上执行更多的工作?

您还需要知道在线程方面会发生什么 - 您不能保证所有内容都会在 map 引用本身上同步。就个人而言,我会将线程与其他问题隔离开来,并更集中地处理它。我会写这样的东西,使用 Guava对于这两个电话:

public void change(Map<String, String> map)
{
Preconditions.checkNotNull(map);
Map<String, String> copy = Maps.newHashMap(map);
// Use copy here
}

Maps.newHashMap 调用使用类型推断来避免您必须像在普通构造函数调用中那样声明类型参数(除非您使用的是 Java 7)。

关于java - 检查防御副本空值的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7391268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com