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 提出问题。
我有以下代码。我在第 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 提出问题。