PMD:避免在条件语句中使用文字

PMD : Avoid using Literals in Conditional Statements

我有以下代码。我在第 5 行的 PMD 中收到 "Avoid using Literals in Conditional Statements." 警告。

List<Object> listObj = getData();
 if (listObj.isEmpty()) {
      throw new NoEntity("No entity found for given Device.");
 }
 if (listObj.size() > 1) {
      throw new MultiEntity(
          "Multiple entity record found for given Device.");
 }

我不想将值为 1 的 global static final int 变量放在 if 条件下使用它。还有其他解决方案吗?

如果您使用的是 Apache Commons Lang,它在 NumberUtils 中可用 https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html#INTEGER_ONE

最好的解决办法是在@SuppressWarnings("PMD.AvoidLiteralsInIfCondition")这样简单的情况下抑制警告。

但是,对于您的示例,我有一个解决方案。

使用Guava的可迭代对象:

List<Object> listObj = getData();
try {
    Object myObj = Iterables.getOnlyElement(listObj);
} catch (NoSuchElementException e) {
    // "No entity found for given Device."
} catch (IllegalArgumentException e) {
    // "Multiple entity record found for given Device."
}

您可以在条件语句之前插入一个赋值,并使用一个漂亮的变量名作为文档。您将提高可读性并消除警告。

boolean multiEntityDevice = listObj.size() > 1;
if (multiEntityDevice) {
  throw new MultiEntity(
      "Multiple entity record found for given Device.");
}

您可以修改 PMD 配置中的 rule definition 以将 1 作为 MagicNumber。我看不出 1 不应该是规则本身的默认值之一的任何原因。


<rule ref="category/java/errorprone.xml/AvoidLiteralsInIfCondition">
    <properties>
        <property name="ignoreMagicNumbers" value="-1,0,1" />
        <property name="ignoreExpressions" value="true" />
    </properties>
</rule>

如果您不喜欢自己修改规则配置,可以通过 PMD on Github 提出问题。