是否可以检测PMD规则中的自动装箱?

时间:2015-05-20 22:04:19

标签: java pmd

Apache Thrift代码生成器生成的类看起来像这样。 numCpus字段可以为空,但由于它是一个值类型,因此还有另一个isSet字段来确定它是否真的设置了:

public class TaskConfig extends TBase<TaskConfig, TaskConfig._Fields> {
  private boolean isSetNumCpus; // Actual implemntation is a bitfield.
  private double numCpus;

  public boolean isSetNumCpus() {
    return isSetNumCpus;
  }

  public double getNumCpus() {
    return numCpus;
  }

  public void setNumCpus(double numCpus) {
    this.numCpus = numCpus;
    this.isSetNumCpus = true;
  }

  // hashCode, equals, copy constructor, field enum etc. omitted
}

我们的样式指南更喜欢将可空值包装为Optional,以便我们不会忘记空检查。所以看到这段代码很常见:

TaskConfig task = getTaskConfigFromWire();
Optional<Double> numCpus = Optional.ofNullable(task.getNumCpus());

但这是错误的 - 由于自动装箱,这个参数永远不会是null,正确的调用应该是这样的:

TaskConfig task = getTaskConfigFromWire();
Optional<Double> numCpus = task.isSetNumCpus()
    ? Optional.of(task.getNumCpus())
    : Optional.<Double>empty();

有没有办法编写捕获此调用的PMD规则(Optional.ofNullable使用将自动装箱的值类型调用?)

1 个答案:

答案 0 :(得分:1)

我会下载PMD二进制文件并使用设计器,您将能够看到该表达式如何具有PrimaryExpression和PrimaryPrefix的名称:Optional.ofNullable&#39;,然后您可以检查PrimarySuffix参数找到方法调用或变量。然后,您必须查找类文件以查找类型并使用它来确定您是否错误地将自动装箱值设置为自选。

我个人会将其作为Java规则实现,而不是XPath规则。

有关详细信息,请参阅http://pmd.sourceforge.net/pmd-4.3.0/howtowritearule.html