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

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

Sonar提示集合本身对其调用了removeAll。

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

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

最佳答案

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

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

那是否意味着该代码还可以呢?

不,这不好。

该代码:

  • 依靠列表的removeAll的实现足够聪明,以处理一个非常奇怪的用例
  • 不必要地阅读和理解,因此会产生维护问题
  • 正在做不必要的工作,因此需要花更多的时间来完成它的工作(不是很可能会很重要)

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

    10-06 13:39