Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可折叠语句_Java_Pmd_Statements - Fatal编程技术网

Java 可折叠语句

Java 可折叠语句,java,pmd,statements,Java,Pmd,Statements,我最近使用PMD(嵌入hudson中)遇到了以下警告,我的代码似乎受到了可折叠IFStatements的影响,我不完全理解。代码如下所示 // list to be filled with unique Somethingness List list = new ArrayList(); // fill list for (SomeObject obj : getSomeObjects()) { // interating if (!obj.getSomething().isEmpty(

我最近使用PMD(嵌入hudson中)遇到了以下警告,我的代码似乎受到了可折叠IFStatements的影响,我不完全理解。代码如下所示

// 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
    }
  }
}

在我看来,这段代码并不是更“可折叠”(否则,下一个阅读代码的人将更不可读)。另一方面,我希望解决此警告(不停用PMD;)。

我认为这就是PMD想要的:

if (!obj.getSomething().isEmpty() && !list.contains(obj.getSomething())) {
  list.add(obj.getSomething());
}
以下是一些改进建议(以及防止PMD尖叫):

  • 提取变量:

    final Something sth = obj.getSomething();
    if (!sth.isEmpty() && !list.contains(sth)) {
      list.add(sth);
    }
    
  • 某物中提取方法(更多OOD):

  • 它是可折叠的:

    if (!obj.getSomething().isEmpty() && !list.contains(obj.getSomething())) {
        list.add(obj.getSomething());
    }
    

    嗯,这个检查有时很有用,但在其他一些情况下应该忽略。关键是让代码尽可能可读。如果您觉得您的代码比折叠的If语句更可读,那么添加一个
    @SuppressWarnings(“PMD.collapsableifstatements”)
    注释。

    一种可能性是排除重复的
    obj.getSomething()
    然后折叠嵌套的
    If
    语句:

    for (SomeObject obj : getSomeObjects()) {
      Something smth = obj.getSomething();
      if (!smth.isEmpty() && !list.contains(smth)) {
          list.add(smth);
      }
    }
    
    在我看来,结果是相当可读的,应该不再触发PMD警告


    另一种方法是将
    列表
    替换为
    集合
    ,并避免显式的
    包含()
    检查。使用
    集合
    也会有更好的计算复杂度。

    嗨,托马斯,谢谢你的回答,我真的很喜欢这种方法#2。
    if (!obj.getSomething().isEmpty() && !list.contains(obj.getSomething())) {
        list.add(obj.getSomething());
    }
    
    for (SomeObject obj : getSomeObjects()) {
      Something smth = obj.getSomething();
      if (!smth.isEmpty() && !list.contains(smth)) {
          list.add(smth);
      }
    }