【问题标题】:Eclipse warning "Type safety: Unchecked cast" has got recursive solutionsEclipse 警告“类型安全:未经检查的演员表”有递归解决方案
【发布时间】:2014-01-12 18:40:51
【问题描述】:

在我的例子中,我有这个来操作给定 HashMap 的浅拷贝

public class SomeClass
{
    private HashMap<String, String> hashMap;
    public SomeClass( private HashMap<String, String> hashMap )
    {
        this.hashMap = (HashMap<String, String>) hashMap.clone();
    }
}

但是 eclipse 建议我提取到局部变量或方法或添加演员表,当我这样做时,它一直建议我相同的解决方案:)

我已经来到this post,从接受的答案中我觉得不太清楚

“新的 HashMap 创建调用正在浪费内存”

当我将其应用于我的代码时,我将拥有

if(songData.clone() instanceof HashMap)
{
    this.songData = (HashMap<String, String>) songData.clone();
}

我发现调用clone() 两次会消耗更多的过程。

有没有更好的方法来做到这一点?我的 sn-p 会不会对资源有害?

【问题讨论】:

  • “你用新的HashMap创建调用浪费内存”是指private Map&lt;String, String&gt; someMap = new HashMap&lt;String, String&gt;();中的new你的代码没有这个问题。
  • 从逻辑上讲,您不需要在这里检查instanceof,因为HashMap#clone() 将始终返回HashMap 类型的对象。但是,由于它间接覆盖了Object#clone(),因此HashMap#clone() 方法的实际返回类型是Object 而不是HashMap,这就是您收到警告的原因。我个人不会担心这个警告。
  • 是的,谢谢,有没有更好的方法来从内存、速度和可靠性方面实现这一目标?
  • 我可能只使用 new HashMap&lt;String, String&gt;(hashMap) 而不是使用 clone() : stackoverflow.com/questions/2356809/…

标签: java eclipse performance hashmap shallow-copy


【解决方案1】:

不要使用克隆。 clone() 是一种设计糟糕的方法,它需要对被克隆的对象有太多的了解,并且无论如何用户都经常错误地实现。 (有关这方面的更多信息,请参阅Effective Java

复制地图的最佳方法是使用相同的数据创建一个新地图:

public SomeClass( HashMap<String, String> hashMap )
{
    this.hashMap = new HashMap<String,String>(hashMap);
}

另外作为仅供参考,public SomeClass( private HashMap&lt;String, String&gt; hashMap ) 不会编译。您不能使用带有 private 关键字的参数。从参数中删除“private”是可行的。

新的 HashMap 调用会浪费内存

这是您引用的另一篇文章的答案,因为他们的代码是:

private Map<String, String> someMap = new HashMap<String, String>();
someMap = (HashMap<String, String>)...

someMap 是通过调用 new Hashmap() 创建的,但随后该引用立即被替换为不同的 HashMap。

这与您的问题无关,因此您可以忽略它。

【讨论】:

  • 复制构造函数本身呢?在官方文档中,他们说将克隆用于浅拷贝,而对拷贝构造函数只字未提,我现在无法尝试进行测试。顺便说一句,参数中的“私人”被错误地粘贴了:)
  • 我也喜欢 putAll() 对这篇文章的第二个回答 stackoverflow.com/questions/2356809/… 的解决方案,但我不知道它的性能
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多