为什么将条目集添加为 addall 方法的参数是一种不好的做法?

dan*_*iel 0 java sonarqube

为什么下面的代码是一种不好的做法?解决方案是什么?

TreeSet<Map.Entry<Integer, Map<String, String>>> sortedtable = new TreeSet<>(new ComparatorByDueDate());


public void sortTable(Map<Integer, Map<String, String>> table){
     sortedtable.addAll(table.entrySet());
}
Run Code Online (Sandbox Code Playgroud)

更新:根据声纳,这是一个不好的做法。我在这里问这个问题是因为声纳的解释似乎令人困惑。

Sil*_*olo 5

JavaMap.Entry对象不适合长期存储。从文档(强调我的),

映射条目(键值对)。该Map.entrySet方法返回地图的集合视图,其元素属于此类。获取映射条目引用的唯一方法是从此集合视图的迭代器。这些Map.Entry对象仅在迭代期间有效;更正式地说,如果迭代器返回条目后修改了支持映射,则映射条目的行为是未定义的,除非通过映射条目上的 setValue 操作。

如果任何人出于任何原因添加、删除或修改地图的任何部分,那么您的TreeSet条目现在具有未定义的行为。它们可能仍然很好,它们可能会被淘汰,它们可能会表现出一些随机行为。

如果要存储一对元素,则编写一个具有两个实例变量的类。如果您使用的是足够新的 Java 版本,那么记录对于此类事情非常有用。