当前位置: 首页 > 面试题库 >

使用Collection自身调用的removeAll()的潜在错误

公羊信厚
2023-03-14
问题内容

在使用Sonar进行代码审查期间,发现以下代码是错误的代码:

ArrayList<String> ops = new ArrayList<String>();
ops.add("test");
ops.removeAll(ops);

Sonar抱怨集合本身调用了removeAll。

我同意这很丑陋,但这会引入错误吗?

注意:这不是我的代码,我正在对其进行审查。


问题答案:

问题是,是否ConcurrentModificationException可能导致,或列表损坏,循环不断,删除条目失败或类似原因。

ArrayList,尤其是在Oracle的JDK8中,似乎不会发生这些问题。

那是否表示该代码还可以呢?

不,这不好。

该代码:

  • 依靠列表的实现removeAll足够聪明以处理一个非常奇怪的用例

  • 不必要地复杂阅读和理解,从而造成维护问题

  • 正在做不必要的工作,因此完成工作所需的时间超过了需要的时间(不是,这可能很重要)

您是在代码审查的背景下这么说的。我会对其进行标记,并与他们讨论为什么使用它,并从可靠性,维护和(非常次要)性能的角度解释为什么ops.clear();ops = new ArrayList<String>();(取决于上下文)几乎肯定是一个更好的选择。



 类似资料:
  • 我正在编写一个在简单的对等网络中搜索客户端的方法。我编写的方法 searchForResponsibleClient 在此网络中获取一个点,并检查调用 searchForResponsibleClient 方法的客户端是否负责此点。 如果它有责任,它会自己回来。 如果它不负责,它会查看其客户端邻居(保存在对象中),并检查是否有任何邻居负责,如果是这样,它将返回邻居。 这两个场景工作正常。 如果邻居

  • 在测试类中,有一个静态方法返回特定目录中的一组所有文件。 因为该方法调用自身来循环文件,所以我在该方法之外实例化了一组,以添加我找到的文件。第一次调用该方法时效果很好,但第二次调用时,被累加起来,由于return语句,我无法清除它。有什么想法吗? 如果我编写更多的方法,或者每次调用该方法时手动清除集合,我可能会解决这个问题,但这一切似乎都不优雅和干净。

  • 复制说明如下。 我在OptaPlanner计划引擎中使用Drools进行评分。 OptaPlanner v8。8.0.期末考试 流v7的口水。55.0.决赛 此格式的规则是否隐式强制转换了? 以下规则是否有无效的? 在我的实际实现中,我有一个非常类似的规则。它不需要第二个函数,但添加第二个函数会导致调用。 你不能有一个以上的吗?考虑到Drools v7.56.0 Doc,图85,我怀疑这不是一个限

  • 问题内容: 假设我要对对象列表进行排序: 而且我的类实现了,因此必须重写该方法。 而且我必须在该方法中编写排序逻辑。 内部如何调用该方法? 问题答案: 请参阅开放的jdk源代码。我想这会有所帮助。 java.util.Collections: 集合排序调用Arrays.sort java.util.Arrays: Arrays.sort调用Arrays.mergeSort,您的答案在第1157行。

  • 本文向大家介绍Python中Collection的使用小技巧,包括了Python中Collection的使用小技巧的使用技巧和注意事项,需要的朋友参考一下 本文所述实例来自独立软件开发者 Alex Marandon,在他的博客中曾介绍了数个关于 Python Collection 的实用小技巧,在此与大家分享。供大家学习借鉴之用。具体如下: 1.判断一个 list 是否为空 传统的方式: 由于一个

  • 描述 (Description) KnockoutJS Observable removeAll()方法删除所有项并将它们作为数组返回。 语法 (Syntax) arrayName.removeAll() 参数 (Parameters) 不接受任何参数。 例子 (Example) <!DOCTYPE html> <head> <title>KnockoutJS Observab