【问题标题】:Is it possible to detect autoboxing in a PMD rule?是否可以在 PMD 规则中检测自动装箱?
【发布时间】:2015-05-20 22:04:19
【问题描述】:

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 调用的值类型将被自动装箱)?

【问题讨论】:

    标签: java pmd


    【解决方案1】:

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

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

    详情请见http://pmd.sourceforge.net/pmd-4.3.0/howtowritearule.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2015-10-13
      • 2010-09-09
      • 2014-09-03
      • 1970-01-01
      相关资源
      最近更新 更多