CollapsibleIfStatements

Rob*_*Rob 5 java pmd statements

我最近使用PMD(嵌入在哈德森中)发现了以下警告,我的代码似乎遭受了CollapsibleIfStatements,我并不完全理解.代码看起来像这样

// list to be filled with unique Somethingness
List list = new ArrayList();

// fill list
for (SomeObject obj : getSomeObjects()) { // interating 
  if (!obj.getSomething().isEmpty()) { // check if "Something" is empty *
    if (!list.contains(obj.getSomething())) { // check if "Something" is already in my list **
      list.add(obj.getSomething()); // add "Something" to my list
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这段代码并不是"可折叠的"(否则对于下一个阅读代码的人来说,这将更加难以理解).另一方面,我想要解决此警告(不停用PMD;).

NPE*_*NPE 6

一种可能性是分解重复obj.getSomething()然后折叠嵌套if语句:

for (SomeObject obj : getSomeObjects()) {
  Something smth = obj.getSomething();
  if (!smth.isEmpty() && !list.contains(smth)) {
      list.add(smth);
  }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,结果非常易读,不应再触发PMD警告.

另一种方法是List用a 替换Set,并contains()完全避免显式检查.使用a Set也会有更好的计算复杂性.