在使用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>();
(取决于上下文)几乎肯定是更好的选择。